我是python的新手。我想基于唯一ID计算按行平均值。
我的DataFrame是:
ID Time[h] concentration[g/L]
15127 V527 23.425 59.9
20361 V527 27.570 73.4
21880 V527 29.281 75.4
33133 V560 27.677 75.9
35077 V560 30.183 75.7
37117 V560 31.847 74.6
我想根据每个ID计算按行平均值。这样我的输出看起来像这样
ID Time[h] concentration[g/L] avg [g/L]
15127 V527 23.425 59.9 NaN
20361 V527 27.570 73.4 66.5
21880 V527 29.281 75.4 74.4
33133 V560 27.677 75.9 NaN
35077 V560 30.183 75.7 66.5
37117 V560 31.847 74.6 75.8
我尝试过:
df.groupby(['ID'])['concentration[g/L]'].mean()
但这从整体上返回了每个ID的平均值。
所以我尝试了这个:
df.groupby(['ID'])['concentration[g/L]'].transform('mean')
这再次返回每个组的均值,但填充到我df的相同长度。
如果有不清楚的地方,我可以改一下我的问题。
预先感谢!
答案 0 :(得分:1)
尝试将pd.rolling.mean
与2的窗口一起使用
>>> df['avg [g/L]'] = df.groupby('ID')['concentration[g/L]'].rolling(2).mean().values
>>> df
ID Time[h] concentration[g/L] avg [g/L]
15127 V527 23.425 59.9 NaN
20361 V527 27.570 73.4 66.65
21880 V527 29.281 75.4 74.40
33133 V560 27.677 75.9 NaN
35077 V560 30.183 75.7 75.80
37117 V560 31.847 74.6 75.15
答案 1 :(得分:0)
您可以使用shift
:
df['avg'] = df.groupby('ID')['concentration[g/L]'].apply(lambda x: (x + x.shift())/2)
print(df)
ID Time[h] concentration[g/L] avg
15127 V527 23.425 59.9 NaN
20361 V527 27.570 73.4 66.65
21880 V527 29.281 75.4 74.40
33133 V560 27.677 75.9 NaN
35077 V560 30.183 75.7 75.80
37117 V560 31.847 74.6 75.15