问题描述
我有一个将键存储为 ID 的数据框,以及 Val1/Val2 中的一些数值:
ID Val1 Val2
id0 10 20
id0 11 19
id1 5 5
id1 1 1
id1 2 4
我想查看此数据框并成对组合行,同时获取具有相同 ID 的行的 Val1/Val2 的平均值。应根据新行的编号对添加后缀。
这是结果数据框:
ID Val1 Val2
id0_1 10.5 19.5
id1_1 3 3
id1_2 1.5 2.5
在这个例子中,只剩下 3 行了。 (id0,10,20) 与 (id0,11,19) 取平均值并合并为一行。
(id1,5,5) 与 (id1,1,) 和 (id1,1) 与 (id1,2,4) 进行平均以形成剩余的 2 行。
我可以想到一种迭代方法,但这会非常慢。我怎么能以适当的 pythonic/pandas 方式做到这一点?
代码:
df = pd.DataFrame(columns=['ID','Val1','Val2'],data=[['id0',20],['id0',19],['id1',5],1],4]])
解决方法
您可以在按 df.rolling
分组后使用 ID
:
out = df.groupby('ID').rolling(2).mean() \
.dropna(how='all').reset_index(level=1,drop=True)
out.index += '_' + out.groupby(level=0).cumcount().add(1).astype(str)
>>> out
Val1 Val2
id0_1 10.5 19.5
id1_1 3.0 3.0
id1_2 1.5 2.5