#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