Агрегирование с суммой на основе условия

#python #dataframe #conditional-statements #aggregate

Вопрос:

У меня есть фрейм данных, подобный этому:

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

Я хотел бы получить сумму продаж, агрегированную по месяцам. Тем не менее, я хочу, чтобы две группы месяцев были объединены, первая для месяцев 1-6 (в результате продажи составили 80), а вторая для месяцев 7-12 (в результате 90).

Как лучше всего это сделать?

Комментарии:

1. Я не буду публиковать это в качестве ответа, так как в нем используется дополнительная технология, но с помощью duckdb ( pip install duckdb ) вы можете ответить на свой запрос, используя SQL непосредственно в фрейме данных как таковой: duckdb.query("SELECT CASE WHEN month lt;= 6 THEN 1 ELSE 2 END as halfyear, sum(sales) FROM df GROUP BY halfyear").to_df() .

Ответ №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'] lt; 7, 0, 1) bar = df.groupby(['foo']).sum()  

Здесь создается foo столбец, который назначит группу каждому столбцу в зависимости от определенного вами условия. т. е. df['month'] lt; 7 Затем, используя этот созданный столбец, вы можете выполнить классическую groupby() операцию и получить сумму.


Примечание вы также можете использовать df.groupby(['foo'])['sales'].agg('sum') , если хотите сохранить только столбец «Продажи».

Ответ №2:

Вы можете использовать pd.cut для присвоения меток месяцам и использовать их в groupby :

 gt;gt;gt; 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