У меня есть два кадра данных, каждый из которых содержит значения данных и месяцы (это соответствующие столбцы). Второй кадр данных также содержит значения TMIN (минимум) и TMAX (максимум), указанные в столбце Элемент.
Первый кадр данных содержит 12 записей, показывающих максимальные температуры, которые произошли в данный месяц в период с 2005 по 2014 год. Давайте назовем это df_max
Второй кадр данных показывает температуры, которые произошли после даты отсечения 2014 года. Давайте назовем это df_2.
Я хотел бы создать третий кадр данных, который показывает температуры в df2, которые превышают температуры в df_max, сгруппированные по месяцам.
Это значения в df_max
Data_Value
Month
1.0 217.0
2.0 194.0
3.0 317.0
4.0 306.0
5.0 367.0
6.0 406.0
7.0 406.0
8.0 372.0
9.0 372.0
10.0 328.0
11.0 256.0
12.0 194.0
Вот некоторые значения в df2:
ID Date Element Data_Value Month
19 USC00205563 2015-01-03 TMIN -39 1
30 USC00203712 2015-03-17 TMAX 800 3
34 USC00200032 2015-06-06 TMIN 128 6
46 USW00014833 2015-08-30 TMIN 178 8
50 USC00202308 2015-08-30 TMIN 156 8
51 USC00205563 2015-01-03 TMAX 22 1
59 USC00202308 2015-08-30 TMAX 600 8
72 USC00200230 2015-04-01 TMIN -17 4
126 USC00200032 2015-06-06 TMAX 233 6
139 USW00014853 2015-05-17 TMIN 183 5
146 USC00208972 2015-04-09 TMAX 67 4
155 USC00205050 2015-01-05 TMIN -139 1
157 USC00200230 2015-04-01 TMAX 183 4
170 USC00203712 2015-03-17 TMIN 11 3
179 USC00208972 2015-05-27 TMAX 500 5
Я думаю, что я должен сначала сгруппировать значение элемента в ноль по температурам TMAX и по месяцам, а затем отфильтровать значения, чтобы сосредоточиться только на тех, которые больше максимума каждого месяца в df_max. Вот код, который у меня есть:
df3 = df2[df2['Element'] =='TMAX'].groupby[('Month')('Data_Value')].filter(lambda x: x > df_max['Data_Value'])
Возвращает сообщение об ошибке «Ошибка типа: объект« str »не может быть вызван»
Желаемый результат
Итак, мой желаемый результат: например, предположим, что у df2 есть i.) 3 строки попадают под месяц 2, а их значения равны 800, 400 и 150. ii) 4 строки попадают под месяц 5 со значениями 100, 500, 700, 300. и 100.
Новый кадр данных (df3) будет;
i.) содержат строки 800 и 400, так как они превышают максимальное значение 194 в df_max, которое соответствует месяцу 2.
ii.) содержат строки 500 и 700, так как они превышают значение 367 в df_max, которое соответствует 5-му месяцу.
Обновление
Чтобы найти все значения в df2, которые могут превышать максимум каждого месяца в df_max, я решил использовать groupby и nlargest для определения трех лучших температур для каждого месяца с предположением (основанным на наблюдении набора данных), что только верхняя 3 будет превышать максимум в месяц в df_max. Проблема, однако, в том, что выходные данные представлены в формате pd.series, и я не уверен, как сравнивать значения для каждого месяца со значениями в df_max dataframe.
Вот код, который я написал
df3 = df2[df2['Element'] =='TMAX'].groupby("Month")["Data_Value"].nlargest(3)
#find values in df3 that exceed the maximum temperatures in df_max for each month in the year
df3_max = df3[df3.Data_Value >= df_max.Data_Value]
Однако я получаю сообщение об ошибке: AttributeError: у объекта 'Series' нет атрибута 'Data_Value'