Количество значений, сгруппированных по месяцам, годам - ​​Pandas

Я пытаюсь groupby подсчитать даты в месяц и год в конкретном выводе. Я могу делать это в день, но не могу получить такой же результат в месяц/год.

d = ({
    'Date' : ['1/1/18','1/1/18','2/1/18','3/1/18','1/2/18','1/3/18','2/1/19','3/1/19'],                 
    'Val' : ['A','B','C','D','A','B','C','D'],                                      
     })

df = pd.DataFrame(data = d)

df['Date'] = pd.to_datetime(df['Date'], format= '%d/%m/%y')

df['Count_d'] = df.Date.map(df.groupby('Date').size())

Это результат, который я хочу:

        Date Val  Count_d
0 2018-01-01   A        2
1 2018-01-01   B        2
2 2018-01-02   C        1
3 2018-01-03   D        1
4 2018-02-01   A        1
5 2018-03-01   B        1
6 2019-01-02   C        1
7 2019-01-03   D        1

Когда я пытаюсь сделать то же самое, но в месяц и год, я использую следующее:

df1 = df.groupby([df['Date'].dt.year.rename('year'), df['Date'].dt.month.rename('month')]).agg({'count'})
print(df)

Но вывод:

            Date   Val
           count count
year month            
2018 1         4     4
     2         1     1
     3         1     1
2019 1         2     2

Предполагаемый результат:

        Date Val  Count_d Count_m Count_y
0 2018-01-01   A        2       4       6
1 2018-01-01   B        2       4       6
2 2018-01-02   C        1       4       6
3 2018-01-03   D        1       4       6
4 2018-02-01   A        1       1       6
5 2018-03-01   B        1       1       6
6 2019-01-02   C        1       2       2
7 2019-01-03   D        1       2       2
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
9
0
5 669
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Используйте GroupBy.transform для столбцов того же размера, что и исходный DataFrame:

df['Date'] = pd.to_datetime(df['Date'], format= '%d/%m/%y')
y = df['Date'].dt.year
m = df['Date'].dt.month

df['Count_d'] = df.groupby('Date')['Date'].transform('size')
df['Count_m'] = df.groupby([y, m])['Date'].transform('size')
df['Count_y'] = df.groupby(y)['Date'].transform('size')

print(df)
        Date Val  Count_d  Count_m  Count_y
0 2018-01-01   A        2        4        6
1 2018-01-01   B        2        4        6
2 2018-01-02   C        1        4        6
3 2018-01-03   D        1        4        6
4 2018-02-01   A        1        1        6
5 2018-03-01   B        1        1        6
6 2019-01-02   C        1        2        2
7 2019-01-03   D        1        2        2

только что обнаружил, что они удаляют gg с помощью dict. есть идеи, почему?

anky 17.04.2019 13:14

@anky_91 - потому что столбцы того же размера, что и исходный df.

jezrael 17.04.2019 13:15

где ты это увидел @anky_91

Erfan 17.04.2019 13:15

@Erfan получил предупреждение на будущее. Я неправильно реализовал, я думаю, Джез ясно дал понять

anky 17.04.2019 13:16

Вы можете сделать это с pd.Grouper

df['Count_d'] = df.groupby([pd.Grouper(key='Date', freq='D')])['Date'].transform('size').astype(int)
df['Count_m'] = df.groupby([pd.Grouper(key='Date', freq='M')])['Date'].transform('size').astype(int)
df['Count_y'] = df.groupby([pd.Grouper(key='Date', freq='Y')])['Date'].transform('size').astype(int)

Что даст

        Date Val  Count_d  Count_m  Count_y
0 2018-01-01   A        2        4        6
1 2018-01-01   B        2        4        6
2 2018-01-02   C        1        4        6
3 2018-01-03   D        1        4        6
4 2018-02-01   A        1        1        6
5 2018-03-01   B        1        1        6
6 2019-01-02   C        1        2        2
7 2019-01-03   D        1        2        2

С этим вы можете группировать по разным частотам, см. документация по DateOffsets

Другие вопросы по теме