pandas,计算微分,高效
pandas, calculate diffrential, efficiently
考虑每个患者的测量数据帧和时间戳
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
可能是一项昂贵的操作,并且您在循环中多次执行相同的操作。如果可能,请尝试使用更少的 groupby
进行所有计算:
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 的经验法则,如果您使用循环,则您可能做错了什么。或者至少以次优的方式。
考虑每个患者的测量数据帧和时间戳
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
可能是一项昂贵的操作,并且您在循环中多次执行相同的操作。如果可能,请尝试使用更少的 groupby
进行所有计算:
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 的经验法则,如果您使用循环,则您可能做错了什么。或者至少以次优的方式。