【问题标题】:Pandas custom groupby熊猫自定义 groupby
【发布时间】:2021-08-25 19:30:10
【问题描述】:

有没有办法在 Pandas 中使用自定义 groupby 函数?例如假设我有下面的数据。

a|b|c
-----
1 2 3
1 2 4
1 3 7
1 4 3
1 4 5
2 1 0
2 3 5
2 4 6
2 3 6
3 1 0
4 1 0
4 2 3

如果 a 不在 [2,4] 中,是否可以按 a 和 b 对我的数据进行分组,否则按 a 分组?

在上面的示例中,我想获得以下组:

123
124

137

143
145

210
235
246
236

310

410
423

b 列是一个开集,所以我希望有一个独立于 b 中的值的函数

【问题讨论】:

    标签: python pandas pandas-groupby


    【解决方案1】:

    你可以maskb 列当a 满足你的条件时使用isin 并替换为任何值(如1),然后在groupby 中使用它。

    for _, dfg in df.groupby(['a', 
                              df['b'].mask(df['a'].isin([2,4]), # condition
                                           1)]):  # replacement value
        print('new group')
        print(dfg)
    new group
       a  b  c
    0  1  2  3
    1  1  2  4
    new group
       a  b  c
    2  1  3  7
    new group
       a  b  c
    3  1  4  3
    4  1  4  5
    new group
       a  b  c
    5  2  1  0
    6  2  3  5
    7  2  4  6
    8  2  3  6
    new group
       a  b  c
    9  3  1  0
    new group
        a  b  c
    10  4  1  0
    11  4  2  3
    

    【讨论】:

      【解决方案2】:

      IIUC,你也可以试试:

      这里,如果 a 的值在 [2,4] 中,它将忽略 b 列中的值并将它们组合在一起。

      for _, k in df.groupby([df.a.values, np.where(df.a.isin([2, 4]), 0, df.b)]):
          print(k)
      
      输出:
         a  b  c
      0  1  2  3
      1  1  2  4
         a  b  c
      2  1  3  7
         a  b  c
      3  1  4  3
      4  1  4  5
         a  b  c
      5  2  1  0
      6  2  3  5
      7  2  4  6
      8  2  3  6
         a  b  c
      9  3  1  0
          a  b  c
      10  4  1  0
      11  4  2  3
      

      【讨论】:

        【解决方案3】:

        您可以创建一个临时的 Series 元组,包含 (a)(a, b),然后按此分组:

        a = df[['a']].apply(tuple, axis=1)
        ab = df[['a', 'b']].apply(tuple, axis=1)
        
        df['group'] = np.where(df['a'].isin([2,4]), a, ab)
        

        输出

        > df.sort_values('group')
        
         a  b  c  group
         1  2  3 (1, 2)
         1  2  4 (1, 2)
         1  3  7 (1, 3)
         1  4  3 (1, 4)
         1  4  5 (1, 4)
         2  1  0   (2,)
         2  3  5   (2,)
         2  4  6   (2,)
         2  3  6   (2,)
         3  1  0 (3, 1)
         4  1  0   (4,)
         4  2  3   (4,)
        

        【讨论】:

          【解决方案4】:

          您可以间接执行此操作。首先定义一个定义组的函数:

          def grouping(row):
              if row.a in [2,4]:
                  return 0
              else:
                  return f"{row.a}_{row.b}"
          

          然后使用apply获取分组列:

          df['grouping'] = df.apply(grouping)
          

          然后按grouping 列分组:

          df = df.groupby('grouping')
          

          【讨论】:

            猜你喜欢
            • 2022-09-24
            • 2019-02-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-03-25
            • 1970-01-01
            • 2018-05-16
            • 2021-06-16
            相关资源
            最近更新 更多