熊猫 groupby 和总和组

Posted

技术标签:

【中文标题】熊猫 groupby 和总和组【英文标题】:Pandas groupby and sum total of group 【发布时间】:2018-07-30 23:52:28 【问题描述】:

我有一个带有客户退款原因的 Pandas DataFrame。 它包含这些示例数据行:

    **case_type**       **claim_type**
1   service             service
2   service             service
3   chargeback          service
4   chargeback          local_charges
5   service             supplier_service
6   chargeback          service
7   chargeback          service
8   chargeback          service
9   chargeback          service
10  chargeback          service
11  service             service_not_used
12  service             service_not_used

我想将客户的原因与某种标记的原因进行比较。这没问题,但我还想查看特定组中的记录总数(客户原因)。

case_claim_type = df[["case_type", "claim_type"]]
case_claim_type.groupby(by=("case_type", "claim_type"))["case_type"].count()

这给了我这个输出,例如:

**case_type**     **claim_type**                 
service           service                         2
                  supplier_service                1
                  service_not_used                2
chargeback        service                         6
                  local_charges                   1

我还想要每个 case_type 的输出总和。比如:

**case_type**     **claim_type**                 
service           service                         2
                  supplier_service                1
                  service_not_used                2
                  total:                          5
chargeback        service                         6
                  local_charges                   1
                  total:                          7

它不一定必须是最后一种输出格式,每个 case_type 的(聚合)总计的列也可以。

【问题讨论】:

你能提供一些示例输入数据吗? @ScottBoston 是的,我刚刚添加了一些示例输入数据 【参考方案1】:

地点:

df = pd.DataFrame('case_type':['Service']*20+['chargeback']*9,'claim_type':['service']*5+['local_charges']*5+['service_not_used']*5+['supplier_service']*5+['service']*8+['local_charges'])

df_out = df.groupby(by=("case_type", "claim_type"))["case_type"].count()

pd.concatsum 与级别参数一起使用,assign

(pd.concat([df_out.to_frame(),
           df_out.sum(level=0).to_frame()
                 .assign(claim_type= "total")
                 .set_index('claim_type', append=True)])
  .sort_index())

输出:

                             case_type
case_type  claim_type                 
Service    local_charges             5
           service                   5
           service_not_used          5
           supplier_service          5
           total                    20
chargeback local_charges             1
           service                   8
           total                     9

【讨论】:

谢谢。非常优雅的解决方案!【参考方案2】:

你可以使用:

df = case_claim_type.groupby(by=("case_type", "claim_type"))["case_type"].count()
print (df)
case_type   claim_type      
chargeback  local_charges       1
            service             1
service     service             2
            supplier_service    1
Name: case_type, dtype: int64

您可以通过聚合sum 创建新的DataFrame 并通过MultiIndex.from_tuples 添加MultiIndex

df1 = df.sum(level=0)
#same as
#df1 = df.groupby(level=0).sum()
new_cols= list(zip(df1.index.get_level_values(0),['total'] * len(df.index)))
df1.index = pd.MultiIndex.from_tuples(new_cols)
print (df1)
chargeback  total    2
service     total    3
Name: case_type, dtype: int64

然后concat一起和最后sort_index

df2 = pd.concat([df,df1]).sort_index()
print (df2)
case_type   claim_type      
chargeback  local_charges       1
            service             1
            total               2
service     service             2
            supplier_service    1
            total               3
Name: case_type, dtype: int64

【讨论】:

感谢您的解决方案,这非常直观。我已经尝试过了,效果很好。但是,我将另一个答案标记为解决方案,因为答案更简洁。 @eppe2000 - 如果你得到 2 个不错的答案,那总是很难 ;) 但使用什么解决方案取决于你 ;) 祝你好运! 嘿@jezrael - 我知道这有点死灵法,但我一直在寻找接近这个答案的答案,但总可以做的不仅仅是加法;说,也意味着。有什么线索吗? @cjcrm - 然后将df1 = df.sum(level=0) 更改为df1 = df.mean(level=0) @jezrael 对,但是如果我的 groupby 使用 groupby(...).agg('case_type':['sum','mean']) 会怎样?为每个应用的 agg 函数获取 case_type 正确值的最佳方法?

以上是关于熊猫 groupby 和总和组的主要内容,如果未能解决你的问题,请参考以下文章

如何在熊猫的 groupby 对象中获取组数?

熊猫可能使用 groupby 和 resample 的错误

熊猫系列的部分总和

在熊猫中使用 groupby 或聚合的最佳方法

如何正确使用带有应用功能的熊猫 groupby 来解决副作用? (第一组申请两次)

带有groupby的熊猫数据框滚动窗口