首页 > 解决方案 > 计算熊猫数据框中不同行中单元格之间的差异

问题描述

我在熊猫中有一个这样的数据框:

       Timestamp   ID      X X Diff       Y Y Diff
0              0  100  1.728   None  14.378   None
1             12  100  2.035   None  14.378   None
2             24  100  2.342   None  14.378   None
3             36  100  2.630   None  14.378   None
4             48  100  2.937   None  14.416   None

我想要做的是计算行中 X 和 Y 值之间的差异,将结果添加到 X Diff 和 Y Diff 各自的列中以获得这样的结果。

    Timestamp   ID      X X Diff       Y Y Diff
0           0  100  1.728   None  14.378   None
1          12  100  2.035  0.307  14.378      0
2          24  100  2.342  0.307  14.378      0
3          36  100  2.630  0.288  14.378      0
4          48  100  2.937  0.307  14.416  0.038

仅当行和它的前驱具有相同的 ID 时才应该进行计算(如果前驱为空 - 第一行 - 或具有不同的 ID,则默认保留“无”)。

我通过一个基本的 for 循环为属于同一 ID 的所有条目创建了一个函数来执行此操作:

def getDifferences(dataframe, column):
    for i in range(19):
        startValue = dataframe.iloc[i][column]
        endValue = dataframe.iloc[i+1][column]
    
        diff = endValue - startValue
        if column == "X":
            dataframe.at[i+1, "X Diff"] = diff
        else:
            dataframe.at[i+1, "Y Diff"] = diff

由于数据已被清理,并且完整的数据帧总是有 20 个相同 ID 的条目,然后是另一个 ID 的其他 20 个条目,我可以在整个数据帧上创建第二个循环,将这 20 个属于的条目隔离到一个新的数据帧中,使用上述方法并重复。

但是,考虑到我的数据帧总共包含超过 100k 行,我被引导相信这个双 for 循环到目前为止并不是最有效的方法。

我尝试在网上搜索,但没有发现内置的 pandas 功能可以实现更优雅的解决方案,而不是上述蛮力。

也许这里有人可以帮助我。也许有一种麻木的方法可以做到这一点,我看不到?

标签: pythonpandasnumpy

解决方案


Groupby'ID'并计算差异然后分配回df:

df[['X diff','Y Diff']]=df.groupby('ID')[['X','Y']].diff()

输出df

  Timestamp     ID      X        Y      X diff  Y Diff
0   0           100     1.728   14.378  NaN     NaN
1   12          100     2.035   14.378  0.307   0.000
2   24          100     2.342   14.378  0.307   0.000
3   36          100     2.630   14.378  0.288   0.000
4   48          100     2.937   14.416  0.307   0.038

推荐阅读