【问题标题】:How to combine rows in a dataframe in a pairwise fashion while applying some function如何在应用某些功能时以成对方式组合数据框中的行
【发布时间】:2021-07-01 16:11:23
【问题描述】:

我有一个将键存储为 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 与组内下一行的平均值吗?
  • 没有pair能解释一下逻辑吗?
  • @Umar.H 总会有至少一对
  • @ifly6 不,它应该对之前存在的旧数据进行操作。所以不要对已经平均的东西取平均值

标签: python pandas algorithm dataframe pairwise


【解决方案1】:

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

【讨论】:

  • 此解决方案不处理应该发生的 '_x' 附加。所以 id0_1, id1_1, id1_2
  • @EugeneZinder。我修正了我的答案。
  • 我添加了另一列“Val3”,我希望应用相同的平均逻辑。运行您的 sn-p 时,不包括“Val3”列。你能解释一下代码的哪一部分需要编辑吗?
  • 您无需修改​​任何内容。 df.groupby 获取所有列。如果要选择特定列,请执行df.groupby('ID')[['Val1', 'Val3']].rolling(...
  • 真的很奇怪,不应该这样。数据框out 无一例外地获取所有列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多