Python 中的 pandas 快速上手之:概念初识

2024-05-18 09:02:35 浏览数 (2)

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 作为数据分析利器的强大功能。

0 人点赞