Вот некоторые примеры данных:
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
Я попытался выбрать строки и объединить их для начала, но, к сожалению, я продолжаю получать ошибки.
Один из самых простых способов — создать карту месяца и сезона, а затем использовать функцию 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: обращается к единственному значению [строка, имя_столбца]. Сначала я использую его, чтобы увидеть, к какому сезону принадлежит эта строка, а затем получить доступ к частоте, чтобы добавить ее в соответствующий счетчик.
Связано с этим вопросом