Pandas如何使用df.diff()实现当前行A列与上一行B列比对计算
Pandas实现当前行A列与上一行B列差值计算
直接用Pandas内置的矢量化方法shift()就能实现,不需要逐行遍历,性能最优。
实现步骤
- 先构造示例测试数据集
- 对B列调用
shift(1)方法,将整列数据向下偏移1位,此时每一行拿到的就是原B列上一行的数值 - 用当前行的A列值减去偏移后的B列值,即可得到目标差值;首行因为没有上一行数据,计算结果会是NaN,按需填充为初始0值即可
完整代码示例
import pandas as pd # 构造示例数据集 df = pd.DataFrame({ 'A': [0.904560, 0.679290, 0.069841, 0.045818, 0.485712, 0.771665, 0.485041, 0.897172, 0.561953, 0.412803], 'B': [0.208318, 0.747496, 0.165834, 0.907888, 0.593785, 0.800182, 0.024829, 0.584406, 0.626699, 0.900643], 'diff': [0]*10 }) # 计算差值:当前行A - 上一行B df['diff'] = df['A'] - df['B'].shift(1) # 首行无前置数据,填充为初始0 df['diff'] = df['diff'].fillna(0)
计算结果参考
执行完代码后得到的DataFrame如下:
A B diff 0 0.904560 0.208318 0.000000 1 0.679290 0.747496 0.470972 2 0.069841 0.165834 -0.677655 3 0.045818 0.907888 -0.120016 4 0.485712 0.593785 -0.422176 5 0.771665 0.800182 0.177880 6 0.485041 0.024829 -0.315141 7 0.897172 0.584406 0.872343 8 0.561953 0.626699 -0.022453 9 0.412803 0.900643 -0.213896
补充说明
- 如果需要做两值的大小比对,直接基于计算出的diff列判断即可,比如
df['A_larger_than_prevB'] = df['diff'] > 0就能标记出当前行A大于上一行B的记录 - 不要使用
iterrows()、apply()逐行迭代做这个计算,数据量较大时矢量化的shift()运算性能会比逐行循环高几个数量级
内容的提问来源于stack exchange,提问作者junyu
相关产品推荐
相关产品推荐

