【问题标题】:How to groupby with consecutive occurrence of duplicates in pandas如何在熊猫中连续出现重复项进行分组
【发布时间】:2018-06-18 09:50:08
【问题描述】:

我有一个包含两列 [Name,In.cl] 的数据框。我想按名称分组,但它基于连续发生。例如考虑下面的DataFrame,

在 DF 下面生成的代码:

df=pd.DataFrame({'Name':['A','B','B','A','A','B','C','C','C','B','C'],'In.Cl':[2,1,5,2,4,2,3,1,8,5,7]})

输入:

    In.Cl Name
0       2    A
1       1    B
2       5    B
3       2    A
4       4    A
5       2    B
6       3    C
7       1    C
8       8    C
9       5    B
10      7    C

我想对连续重复的行进行分组。例如组[B](1,2)、[A](3,4)、[C](6,8)等,并在In.cl列中进行求和运算。

预期输出:

    In.Cl Name col1   col2
0       2    A   A(1)    2
1       1    B   B(2)    6
2       5    B   B(2)    6
3       2    A   A(2)    6
4       4    A   A(2)    6
5       2    B   B(1)    2
6       3    C   C(3)   12
7       1    C   C(3)   12
8       8    C   C(3)   12
9       5    B   B(1)    5
10      7    C   C(1)    7

到目前为止,我尝试了重复和 groupby 的组合,它没有按我的预期工作。我想我需要一些 groupby + 连续的东西。但我没有解决这个问题的想法。

任何帮助将不胜感激。

【问题讨论】:

    标签: python pandas dataframe pandas-groupby


    【解决方案1】:
    In [37]: g = df.groupby((df.Name != df.Name.shift()).cumsum())
    
    In [38]: df['col1'] = df['Name'] + '(' + g['In.Cl'].transform('size').astype(str) + ')'
    
    In [39]: df['col2'] = g['In.Cl'].transform('sum')
    
    In [40]: df
    Out[40]:
       Name  In.Cl  col1  col2
    0     A      2  A(1)     2
    1     B      1  B(2)     6
    2     B      5  B(2)     6
    3     A      2  A(2)     6
    4     A      4  A(2)     6
    5     B      2  B(1)     2
    6     C      3  C(3)    12
    7     C      1  C(3)    12
    8     C      8  C(3)    12
    9     B      5  B(1)     5
    10    C      7  C(1)     7
    

    【讨论】:

    • 不错的答案!如何获得 col1 ?
    【解决方案2】:

    使用itertools.groupby 的回答略显冗长。

    对于超过 ~1000 行,使用 @MaxU's solution - 它更快。

    from itertools import groupby, chain
    from operator import itemgetter
    
    chainer = chain.from_iterable
    
    def sumfunc(x):
        return (sum(map(itemgetter(1), x)), len(x))
    
    grouper = groupby(zip(df['Name'], df['In.Cl']), key=itemgetter(0))
    summer = [sumfunc(list(j)) for _, j in grouper]
    
    df['Name'] += pd.Series(list(chainer(repeat(j, j) for i, j in summer))).astype(str)
    df['col2'] = list(chainer(repeat(i, j) for i, j in summer))
    
    print(df)
    
        In.Cl Name  col2
    0       2   A1     2
    1       1   B2     6
    2       5   B2     6
    3       2   A2     6
    4       4   A2     6
    5       2   B1     2
    6       3   C3    12
    7       1   C3    12
    8       8   C3    12
    9       5   B1     5
    10      7   C1     7
    

    【讨论】:

      猜你喜欢
      • 2022-11-30
      • 2017-04-09
      • 1970-01-01
      • 1970-01-01
      • 2012-11-13
      • 2013-10-28
      • 2020-08-10
      • 1970-01-01
      • 2023-04-08
      相关资源
      最近更新 更多