Pandas 是一个非常厉害的 Python 库,它可以帮助我们更简单高效地处理各种形式的数据。你可以把它想象成一个数据魔术师,能将各种数据如 excel表格、数据库、网页数据等变成Python可以理解和操作的形式。有了 Pandas ,我们不用手动一行一行地读取数据,也不用手动将数据装进 Python 可以使用的数据结构中。Pandas 可以自动帮我们完成这些重复的工作,节省了大量时间和精力。
除此之外,Pandas 还提供了大量实用的函数,方便我们对数据进行各种统计分析、清洗、整理、可视化等处理,是数据分析和处理必不可少的利器。
大家可能会觉得 Python 自带的库已经够用了,为什么还要学习 Pandas 呢?我们来看一个实际的例子。
假设你手上有一个包含 10 万行数据的csv文件,文件里只有两列:timetamp 和 gas_pedal。你需要根据给定的一个目标时间,从这 10万 行数据里找到最接近这个目标时间的那一行,并返回对应的 gas_pedal 值。听起来是不是有点麻烦?
如果只用Python内置的库,你得自己先把整个 csv 文件读进内存,然后一行行遍历所有数据,计算每个时间戳与目标时间的差值,使用二分查找定位找到需要的值, 找出差值最小的那一行。做这些步骤都需要自己动手写很多代码。代码如下:
代码语言:javascript复制import csv
def find_nearest(target, csv_file):
"""
根据目标数字在排序的CSV文件中查找最接近的数字及对应的值
参数:
target (int/float): 目标数字
csv_file (str): CSV文件路径
返回:
tuple: 最接近的数字和对应的值
"""
# 打开CSV文件
with open(csv_file, 'r') as file:
reader = csv.reader(file)
# 将CSV文件中的数字存入列表
nums = [float(row[0]) for row in reader]
# 二分查找
left = 0
right = len(nums) - 1
while left <= right:
mid = (left right) // 2
if nums[mid] == target:
# 找到目标数字
nearest_num = nums[mid]
nearest_val = next(row[1] for row in reader if float(row[0]) == nearest_num)
return (nearest_num, nearest_val)
elif nums[mid] < target:
# 目标数字在右半部分
left = mid 1
else:
# 目标数字在左半部分
right = mid - 1
# 没有找到目标数字,返回最接近的数字及对应的值
nearest_idx = right if right >= 0 and abs(nums[right] - target) < abs(nums[left] - target) else left
nearest_num = nums[nearest_idx]
nearest_val = next(row[1] for row in reader if float(row[0]) == nearest_num)
return (nearest_num, nearest_val)
# 使用示例
target = 1687160644552479420
csv_file = 'ins_can_000000_gaspedel.csv'
nearest_num, nearest_val = find_nearest(target, csv_file)
print(f"离目标数字 {target} 最近的数字是 {nearest_num}, 对应的值为 {nearest_val}")
但如果用了Pandas,整个过程就简单多了!Pandas 可以几行代码就把 csv 读进来,存在一个类似 Excel 表格的数据结构中。然后利用 Pandas 强大的运算能力,几行代码就能算出每个时间戳与目标时间的差值,再找出最小差值对应的那一行数据,返回所需的timetamp 和 gas_pedal。
代码语言:javascript复制import pandas as pd
# 读取 csv 文件内容
pd_csv = pd.read_csv("ins_can_000000_gaspedel.csv")
print(pd_csv) # pd_csv 输出
"""
timestamp gas_pedal
0 1687160644552313854 0.0000
1 1687160644552368280 0.0000
2 1687160644552419868 0.0000
3 1687160644552479422 0.0000
4 1687160644552531764 0.0000
... ... ...
110759 1687160857514424803 NaN
110760 1687160857534642423 22.0472
110761 1687160857554423051 22.0472
110762 1687160857617684338 22.0472
110763 1687160857617750929 NaN
[10764 rows x 2 columns]
"""
# 通过向量操作,获取与目标值最接近那一行的索引值
idx = (pd_csv["timestamp"] - target).abs().idxmin()
# 根据索引值获取需要的结果
nearest_num, nearest_value = pd_csv.loc[idx, ['timestamp', 'gas_pedal']]
print(f"离目标数字 {target} 最近的数字是 {nearest_num}, 对应的值为 {nearest_val}")
是不是感觉比用 Python 内置库要简单高效许多? Pandas 就是这么一个神奇的工具,能让处理大量数据如此轻松愉快。不只是 csv,它还支持字典 cidt、excel、数据库等各种常用数据格式。
下面来了解 pandas 的基础概念。
代码语言:javascript复制import pandas as pd
data = {'Name': ['Alice', 'Bob', 'Claire'],
'Age': [25, 30, 42],
'Weight': [55.0, 72.5, 61.0]}
res = pd.DataFrame(data)
代码语言:javascript复制In [2]: res = pd.DataFrame(data)
...: print(res)
Name Age Weight
0 Alice 25 55.0
1 Bob 30 72.5
2 Claire 42 61.0
Series:
是一种一维的数组对象,它可以存储任意数据类型的数据, Name 列是一个字符串类型的 Series,同理 Age 列是一个整数类型的 Series
代码语言:javascript复制In [3]: print(res["Name"])
0 Alice
1 Bob
2 Claire
Name: Name, dtype: object
DataFrame:
DataFrame 是一个二维的带标签数据结构,就像一个Excel表格,上面的 res 就是 DataFrame 对象。它包含多个按列排列的 Series 对象,每列可以有不同的数据类型(这里是字符串和浮点数)。行和列都有标签索引(这里行是 0 1 2,列是 Name Age Weight)。
Index:
在这个DataFrame中,有两个Index:
1.行索引(Row Index)
这里的行索引是 0, 1, 2, 它标识了 DataFrame 中的每一行记录
2.列索引(Column Index)
这里的列索引是 Name, Age, Weight, 它标识了 DataFrame 中的每一列
代码语言:javascript复制In [5]: print(res.index)
RangeIndex(start=0, stop=3, step=1)
In [6]: print(res.columns)
Index(['Name', 'Age', 'Weight'], dtype='object')
行索引和列索引允许我们通过标签来快速查找、选择和操作 DataFrame 中 的数据。总之, Index 是 Pandas 中的关键概念, DataFrame 有行索引和列索引,允许我们方便地引用数据。
代码语言:javascript复制# 将返回第0行
In [7]: res.loc[0]
Out[7]:
Name Alice
Age 25
Weight 55.0
Name: 0, dtype: object
# 将返回'Age'这一列
In [8]: res['Age']
Out[8]:
0 25
1 30
2 42
Name: Age, dtype: int6
通过上面的讲解的方式,可以更好地理解 Pandas 中这些核心数据结构的概念和布局。Series 就像是一个带标签的一维数组, DataFrame 是由 Series 组成的二维表格,Index 则为数据标注标签。它们的高效组合和丰富的数据操作方法,构成了 Pandas 作为数据分析利器的强大功能。