Как выбрать определенные строки в фрейме данных, сгруппировать их и найти сумму с помощью python?

Вот некоторые примеры данных:

mydf = {'Month': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
        'Freq': [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60]
        }
my_df = pd.DataFrame(mydf, columns=['Month', 'Freq'])
my_df

  Month Freq
0   1   5
1   2   10
2   3   15
3   4   20
4   5   25
5   6   30
6   7   35
7   8   40
8   9   45
9   10  50
10  11  55
11  12  60

Как я могу создать новый фрейм данных, который группирует месяцы по сезонам и находит общую сумму частоты каждого сезона, в то время как на выходе все еще остается фрейм данных?

Я хотел бы что-то вроде этого: (Зима - это когда Месяц = ​​12, 1, 2) (Spring - это где Месяц = ​​3, 4, 5) (и т.д....)

   Season Freq
0  Winter 75
1  Spring 60
2  Summer 105
3  Autumn 150

Я попытался выбрать строки и объединить их для начала, но, к сожалению, я продолжаю получать ошибки.

Связано с этим вопросом

Quang Hoang 11.12.2020 19:05
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
1 030
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Один из самых простых способов — создать карту месяца и сезона, а затем использовать функцию map от панды.

season_map = {1: 'Winter', 2: 'Winter', 3: 'Spring', 4: 'Spring', 5: 'Spring', 6: 'Summer', 7: 'Summer', 8: 'Summer', 9:'Autumn', 10:'Autumn', 11: 'Autumn', 12: 'Winter'}
my_df.loc[:, 'season'] = my_df.Month.map(season_map)
my_df.groupby('season').freq.sum()

Если вы не хотите создавать маппер вручную, вы можете использовать этот ответ: Python: Дата и время до сезона

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

Вы можете создать новый столбец с сезонами и сгруппировать в этом столбце:

my_df['Season']=df['Month'].apply(lambda x: 'Winter' if x in (12,1,2) else 'Spring' if x in (3,4,5) else 'Summer' if x in (6,7,8) else 'Autumn')

res=my_df.groupby('Season')['Freq'].sum()

>>> print(res)

Season
Autumn    150
Spring     60
Summer    105
Winter     75

Это не так стильно, как должно быть (из-за большого количества операторов if), но оно работает:

    import pandas as pd

mydf = {'Month': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
        'Freq': [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60]}
my_df = pd.DataFrame(mydf, columns=['Month', 'Freq'])

winter_counter = 0
spring_counter = 0
summer_counter = 0
autumn_counter = 0

for i in range(len(my_df)):
    #print(my_df.at[i,'Month'])
    if (my_df.at[i,'Month'] == 12 or my_df.at[i,'Month'] == 1 or my_df.at[i,'Month'] == 2):
        winter_counter = winter_counter + my_df.at[i,'Freq']
    if (my_df.at[i,'Month'] == 3 or my_df.at[i,'Month'] == 4 or my_df.at[i,'Month'] == 5):
        spring_counter = spring_counter + my_df.at[i,'Freq']
    if (my_df.at[i,'Month'] == 6 or my_df.at[i,'Month'] == 7 or my_df.at[i,'Month'] == 8):
        summer_counter = summer_counter + my_df.at[i,'Freq']
    if (my_df.at[i,'Month'] == 9 or my_df.at[i,'Month'] == 10 or my_df.at[i,'Month'] == 11):
        autumn_counter = autumn_counter + my_df.at[i,'Freq']

data_for_result = {
    'Season': ['Winter','Spring','Summer','Autumn'],
    'Freq': [winter_counter, spring_counter, summer_counter, autumn_counter],
}
my_result = pd.DataFrame(data_for_result,columns = ['Season','Freq'])
print(my_result)

Если вам нужно объяснение:

.at: обращается к единственному значению [строка, имя_столбца]. Сначала я использую его, чтобы увидеть, к какому сезону принадлежит эта строка, а затем получить доступ к частоте, чтобы добавить ее в соответствующий счетчик.

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.at.html#pandas.DataFrame.at

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