【问题标题】:Aggregation with sum based on condition基于条件的总和聚合
【发布时间】:2022-01-07 06:58:41
【问题描述】:

我有一个这样的 DataFrame:

df = pd.DataFrame(data= {'month' : [2,7,4,8], 'sales' : [10,40,70,50]})

我想获得按月汇总的销售额总和。但是,我想合并两组月份,第一组用于 1-6 个月(导致 80 个月的销售额),第二组用于 7-12 个月(导致 90 个月)。

最好的方法是什么?

【问题讨论】:

  • 我不会将此作为答案发布,因为它使用了额外的技术,但使用 duckdb (pip install duckdb) 您可以直接在数据框上使用 SQL 来回答您的查询,例如:duckdb.query("SELECT CASE WHEN month <= 6 THEN 1 ELSE 2 END as halfyear, sum(sales) FROM df GROUP BY halfyear").to_df()

标签: python dataframe conditional-statements aggregate


【解决方案1】:

一种方法是创建一个作为分组键的列。可以这样做:

import numpy as np
import pandas as pd

df = pd.DataFrame(data= {'month': [2, 7, 4, 8], 'sales' : [10, 40, 70, 50]})
df["foo"] = np.where(df['month'] < 7, 0, 1)
bar = df.groupby(['foo']).sum()

在这里,正在创建一个foo 列,它将根据您定义的条件为每个列分配一个组。即df['month'] &lt; 7。然后使用这个创建的列,您可以执行经典的groupby() 并获得总和。


请注意,如果您只想保留销售列,也可以使用df.groupby(['foo'])['sales'].agg('sum')

【讨论】:

    【解决方案2】:

    您可以使用pd.cut 为月份分配标签,并在groupby 中使用这些标签:

    >>> df.groupby(pd.cut(df["month"], bins=[0, 6, 12], labels=["1-6", "7-12"]))["sales"].sum()
    
    month
    1-6     80
    7-12    90
    Name: sales, dtype: int64
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-21
      • 1970-01-01
      • 1970-01-01
      • 2022-11-04
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多