【问题标题】:pandas groupby excluding when a column takes some valuepandas groupby 排除列何时取值
【发布时间】:2022-01-10 13:42:02
【问题描述】:

有没有办法在聚合时排除采用某些值的行?

例如:

ID | Company | Cost 
1  | Us      | 2
1  | Them    | 1
1  | Them    | 1
2  | Us      | 1
2  | Them    | 2
2  | Them    | 1

我想做一个groupbysum,但只要一行是Company="us" 就忽略。

结果应该是这样的:

ID | Sum of cost
1  | 2
2  | 3

我通过这样做解决了它,但我想知道是否有更聪明的解决方案:

df_agg = df[df['Company']!="Us"][['ID','Cost']].groupby(['ID']).sum()

【问题讨论】:

    标签: python pandas group-by


    【解决方案1】:

    用途:

    print (df)
       ID Company  Cost
    0   1      Us     2
    1   1    Them     1
    2   1    Them     1
    3   2      Us     1
    4   2    Them     2
    5   2    Them     1
    6   3      Us     1 <- added new row for see difference
    

    如果需要先过滤并且不匹配的组(如果存在)并不重要:

    df1 = df[df.Company!="Us"].groupby('ID', as_index=False).Cost.sum()
    print (df1)
       ID  Cost
    0   1     2
    1   2     3
    
    
    df1 = df.query('Company!="Us"').groupby('ID', as_index=False).Cost.sum()
    print (df1)
       ID  Cost
    0   1     2
    1   2     3
    

    如果需要Cost=0Us 的所有组ID,首先将Cost 设置为0,然后聚合:

    df2 = (df.assign(Cost = df.Cost.where(df.Company!="Us", 0))
             .groupby('ID', as_index=False).Cost
             .sum())
    print (df2)
       ID  Cost
    0   1     2
    1   2     3
    2   3     0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-01
      • 1970-01-01
      • 2021-08-27
      • 2020-11-22
      • 1970-01-01
      • 2019-08-16
      • 1970-01-01
      相关资源
      最近更新 更多