1

我是 python 新手。我想根据唯一 ID 计算逐行平均值。

我的数据框是:

       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 的相同长度。

你能帮我吗,如果有什么不清楚的地方,我可以改写我的问题。

提前致谢!

4

2 回答 2

1

尝试使用pd.rolling.mean2 的窗口:

>>> 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
于 2020-09-28T15:17:12.790 回答
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
于 2020-09-28T15:19:10.540 回答