Группировка (сумма) по месяцу, году и другой переменной в Python - PullRequest
0 голосов
/ 09 июля 2020

Я новичок в программировании и использую Python для обработки и анализа данных.

У меня есть фрейм данных, который выглядит так:

Brand   Date    Unit
A       1/1/19  10
B       3/1/19  11
A       11/1/19 15
B       11/1/19 5
A       1/1/20  10
A       9/2/19  18
B       12/2/19 11
B       19/2/19 8
B       1/1/20  5

И Я хотел бы сгруппировать по месяцам, годам и маркам. Если это поможет, у меня также есть отдельные столбцы для месяца и года. Ожидаемый результат должен выглядеть так:

Brand   Date    Unit
A       Jan 2019  25
B       Jan 2019  16
A       Feb 2019  18
B       Feb 2019  19
A       Jan 2020  8
B       Feb 2020  5

Я попытался адаптировать ответ из чьего-то вопроса:

per = df.Date.dt.to_period("M")
g = df.groupby(per,'Brand')
g.sum()

, но меня спросят:

ValueError: No axis named Brand for object type <class 'pandas.core.frame.DataFrame'>

и я понятия не имею, как это решить. , очень грубо, и это не поможет, если df будет обновлен с новыми данными.

Более того, возможно, у меня плохой подход к ситуации. В конце концов, я бы хотел, чтобы df выглядел так:

Brand    Jan 19   Feb 19   Jan 20 
A        25       18       8
B        16       19       5

Ответы [ 2 ]

0 голосов
/ 09 июля 2020

Вы были близки, DataFrame.groupby хочет список групперов, а не голые аргументы.

Вот как я это сделал:

import pandas
from io import StringIO

csv = StringIO("""\
Brand   Date    Unit
A       1/1/19  10
B       3/1/19  11
A       11/1/19 15
B       11/1/19 5
A       1/1/20  10
A       9/2/19  18
B       12/2/19 11
B       19/2/19 8
B       1/1/20  5
""")

(
    pandas.read_csv(csv, parse_dates=['Date'], sep='\s+', dayfirst=True)
        .groupby(['Brand', pandas.Grouper(key='Date', freq='1M')])
        .sum()
        .reset_index()
)

И это дает мне:

  Brand       Date  Unit
0     A 2019-01-31    25
1     A 2019-02-28    18
2     A 2020-01-31    10
3     B 2019-01-31    16
4     B 2019-02-28    19
5     B 2020-01-31     5
0 голосов
/ 09 июля 2020

Используйте pandas.to_datetime и pandas.DataFrame.pivot_table:

df["Date"] = pd.to_datetime(df["Date"], dayfirst=True).dt.strftime("%b %Y")
new_df = df.pivot_table(index="Brand", columns="Date", aggfunc=sum)
print(new_df)

Вывод:

          Unit                  
Date  Feb 2019 Jan 2019 Jan 2020
Brand                           
A           18       25       10
B           19       16        5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...