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

How to combine rows in a dataframe in a pairwise fashion while applying some function

我有一个数据框,将键存储为 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。

这是生成的数据帧:

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,1,) 取平均值,(id1,1,1) 与 (id1,2,4) 取平均值以形成剩余的 2 行。

我可以想到一个迭代的方法来解决这个问题,但是那会很慢。我怎样才能以正确的 pythonic/pandas 方式做到这一点?

代码:

df = pd.DataFrame(columns=['ID', 'Val1', 'Val2'], data=[['id0', 10, 20], ['id0', 11, 19], ['id1', 5, 5], ['id1', 1, 1], ['id1', 2, 4]])

ID分组后可以使用df.rolling:

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