Ежемесячная климатология в течение нескольких лет, повторяемая каждый день в этом месяце в течение всех лет

#python #pandas #dataframe

#питон #панды #фрейм данных

Вопрос:

Мне нужно найти ежемесячную климатологию некоторых данных, которые имеют ежедневные значения в течение нескольких лет. Приведенный ниже код достаточно обобщает то, что я пытаюсь сделать. monthly_mean содержит средние значения за все годы для конкретных месяцев. Затем мне нужно назначить это среднее значение в новом столбце для каждого дня в определенном месяце за все годы. По какой бы то ни было причине мое задание- df['A Climatology'] = group['A Climatology'] это присвоение значений только декабрю. Как я могу выполнить задание на все месяцы?

 data = np.random.randint(5,30,size=(365*3,3)) df = pd.DataFrame(data, columns=['A', 'B', 'C'], index=pd.date_range('2021-01-01', periods=365*3)) df['A Climatology'] = np.nan  monthly_mean = df['A'].groupby(df.index.month).mean() for month, group in df.groupby(df.index.month):  group['A Climatology'] = monthly_mean.loc[month]  df['A Climatology'] = group['A Climatology']   df  

Ответ №1:

Ваш код устанавливает столбец == для группы, поэтому на каждой итерации цикла вы устанавливаете значения df только для этой группы—вот почему ваш df заканчивается в декабре, в последний месяц в списке.

 monthly_mean = df['A'].groupby(df.index.month).mean() for month, group in df.groupby(df.index.month):  df.loc[lambda df: df.index.month == month, 'A Climatology'] = monthly_mean.loc[month]  

Вместо этого вы можете напрямую задать значения df, где месяц == повторяющийся месяц.

Ответ №2:

 merged_df = pd.merge(df,   monthly_mean,   how='left',   left_on=df.index.month,   right_on=monthly_mean.index).drop('key_0', axis=1).set_index(df.index)   A_x B C A Climatology A_y 2021-01-01 12 20 18 NaN 16.752688 2021-01-02 24 26 11 NaN 16.752688 2021-01-03 18 27 15 NaN 16.752688 2021-01-04 18 5 22 NaN 16.752688 2021-01-05 10 15 25 NaN 16.752688 ... ... ... ... ... ... 2023-12-27 19 15 11 16.11828 16.118280 2023-12-28 16 23 25 16.11828 16.118280 2023-12-29 6 13 16 16.11828 16.118280 2023-12-30 10 9 14 16.11828 16.118280 2023-12-31 15 22 17 16.11828 16.118280  

Или сделать это без создания нового фрейма данных:

 df = df.reset_index().merge(monthly_mean, how='left', left_on=df.index.month, right_on=monthly_mean.index).set_index('index')  

monthly_means :

 1 16.752688 2 16.476190 3 16.795699 4 17.111111 5 17.795699 6 18.111111 7 16.806452 8 15.236559 9 15.600000 10 18.279570 11 16.555556 12 16.118280 Name: A, dtype: float64  

Комментарии:

1. Это фантастический ответ. Это правильно и отвечает на вопрос, но это не показывает, почему мой был неправ. Я собираюсь выбрать ответ YoungTim, потому что он объясняет, почему мой был ошибочным, и предлагает решение в контексте моего кода. Тем не менее, спасибо вам за ваш вклад.