【问题标题】:Split-Apply-Combine to aggregate rows in Pandas dataframeSplit-Apply-Combine 聚合 Pandas 数据框中的行
【发布时间】:2020-02-24 05:41:22
【问题描述】:

我正在尝试在以下 pandas 数据帧上运行 split-apply-combine。我想为每个唯一的客户代码显示 col1 值小于或等于 0 的行数,以及 col1 值大于 0 的行数。

所以这张表:

    cust_code   col1    col2
0   113231413   -10     2795.19 
1   113231413   20      1485.76 
2   113231413   25      6201.18 
3   113231413   -25     1502.40 
4   526242422   -23     6470.12 
5   526242422   0       14011.28    
6   414314134   0       12426.78    
7   414314134   26      12104.77

变成:

           cust_code    count1 count2   
0          113231413      2      2      
1          526242422      2      0      
2          414314134      1      1

我知道第一步是使用 groupby,但我不确定下一步该做什么:

count = df.groupby('cust_code')['cust_code'].count()

【问题讨论】:

  • 鉴于您的问题陈述,您的预期结果没有意义。例如,“col2 值大于 0 的行数”。对于 cust_code 113231413,这应该是 4,而不是每个预期结果的 2。
  • 是的,我的错。我重新表述了这个问题。我希望 count2 是 col1 值(不是 col2 值)大于 0 的行数,按 cust_code 分组。

标签: python pandas split-apply-combine


【解决方案1】:

对于熊猫 >= 0.25 尝试:

df.groupby('cust_code')['col1'].agg(count1=(lambda s: s.loc[s <= 0].count()), 
                                    count2=(lambda s: s.loc[s > 0].count())).reset_index()

   cust_code  count1  count2
0  113231413       2       2
1  414314134       1       1
2  526242422       2       0

或者对于旧版 pandas:

df1 = df.groupby('cust_code').agg(
          {'col1': [lambda s: s.loc[s <= 0].count(),
                    lambda s: s.loc[s > 0].count()]
          }
      ).reset_index()
df1.columns=['cust_code','count1','count2']
df1
   cust_code  count1  count2
0  113231413       2       2
1  414314134       1       1
2  526242422       2       0

【讨论】:

    【解决方案2】:

    如果性能很重要,请不要按组过滤,因为如果有很多组,速度会很慢。更好的是创建由掩码填充的新列,转换为整数并聚合sum

    df1 = (df.assign(col1=df['col1'].le(0).astype(int),
                   col2=df['col1'].gt(0).astype(int))
            .groupby('cust_code',sort=False)[['col1','col2']]
            .sum())
    print   (df)1
               col1  col2
    cust_code            
    113231413     2     2
    526242422     2     0
    414314134     1     1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-27
      • 2017-06-24
      • 1970-01-01
      • 2017-12-14
      • 2016-09-10
      • 1970-01-01
      • 2021-11-04
      相关资源
      最近更新 更多