【问题标题】:group rows in a pandas data frame when the difference of consecutive rows are less than a value当连续行的差异小于一个值时,对熊猫数据框中的行进行分组
【发布时间】:2020-06-17 19:13:55
【问题描述】:

我有一个这样的数据框,

col1    col2    col3
 1        2       3
 2        3       4
 4        2       3
 7        2       8
 8        3       4
 9        3       3
 15       1       12

现在我想对两个连续 col1 行之间差异小于 3 的行进行分组。并对其他列值求和,用组的最后一个值创建另一列(col4), 所以最终的数据框看起来像,

col1    col2    col3    col4
  1       7       10     4
  7       8       15     9

使用 for 循环来做这件事很乏味,寻找一些 pandas 的快捷方式来最有效地做这件事。

【问题讨论】:

  • 由于最后两行之间的差异也大于 3 (6),因此您不应该在输出中有第三行吗?
  • @cs95 是的,第三行会在那里

标签: python pandas dataframe


【解决方案1】:

您可以在 groupby 上进行命名聚合:

(df.groupby(df.col1.diff().ge(3).cumsum(), as_index=False)
   .agg(col1=('col1','first'),
        col2=('col2','sum'),
        col3=('col3','sum'),
        col4=('col1','last'))
)

输出:

   col1  col2  col3  col4
0     1     7    10     4
1     7     8    15     9
2    15     1    12    15

update 如果没有命名聚合,您可以执行以下操作:

groups = df.groupby(df.col1.diff().ge(3).cumsum())
new_df = groups.agg({'col1':'first', 'col2':'sum','col3':'sum'})
new_df['col4'] = groups['col1'].last()

【讨论】:

  • 我在做同样的事情时遇到以下错误,跳闸错误:聚合()缺少1个必需的位置参数:'arg'
  • 我认为命名聚合在 Pandas 0.25+ 上可用
  • 我正在使用熊猫 == 1.0.4
  • 是否可以不用命名聚合?
  • 我没有正确地重新阅读问题。只需将同一系列传递给groupby。已更新。
猜你喜欢
  • 1970-01-01
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-09
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
相关资源
最近更新 更多