Python 熊猫,高效地计算差异

Python 熊猫,高效地计算差异,python,pandas,time-series,Python,Pandas,Time Series,考虑每个患者的测量数据帧和时间戳 patient | timestamp | x A | 2014-10-10 | 5.7 A | 2014-10-11 | 6.3 B | 2014-10-11 | 6.1 B | 2014-10-10 | 4.1 我的目标是计算d,即一行x和最近一次测量x之间的差值 正如所建议的,这是我使用的代码 df.sort("timestamp", inpla

考虑每个患者的测量数据帧和时间戳

patient     |  timestamp  |  x
A           |  2014-10-10 |  5.7
A           |  2014-10-11 |  6.3
B           |  2014-10-11 |  6.1
B           |  2014-10-10 |  4.1
我的目标是计算d,即一行x和最近一次测量x之间的差值

正如所建议的,这是我使用的代码

df.sort("timestamp", inplace=True)
df['d'] = df.groupby('patient')['x'].transform(pd.Series.diff).fillna(0)
但是,当尝试在具有许多度量的数据帧上运行此代码时

patient     |  timestamp  |  x_1  |  ...  |  x_n
使用简单循环:

df.sort("timestamp", inplace=True)
g=df.groupby('patient')
for x in df.columns:
    if x.find('x')>=0:
       df[x.replace('x','d')] = g[x].transform(pd.Series.diff).fillna(0)
代码运行得非常慢

有没有更有效的方法来计算差分向量并将其连接到测量向量?

groupby可能是一个昂贵的操作,并且您在循环中多次执行相同的操作。如果可能,尝试使用较少的groupbys进行所有计算:

cols = [col in df where col[0] = 'x']
res = df.groupby('patient')[cols].diff().fillna(0)
要连接,请先重命名,然后连接:

res = res.rename(columns=(lambda col: 'd'+col[1:]))
df = df.join(res, how='outer')

根据pandas和numpy的经验,如果使用循环,可能是做错了什么。或者至少以次优方式。

谢谢@ari,我确实需要将结果连接到新列,例如以d开头