如何在应用某些功能的同时以成对的方式组合数据框中的行

问题描述

我有一个将键存储为 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