Сравнение двух фреймов данных с использованием нескольких условий с групповой функцией и функцией фильтра - PullRequest
0 голосов
/ 10 января 2019

У меня есть два кадра данных, каждый из которых содержит значения данных и месяцы (это соответствующие столбцы). Второй кадр данных также содержит значения 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'

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Я думаю, это то, что вы хотите.

df3 = df2[df2['Element'] =='TMAX'].groupby("Month").max()
df3 = df3[df3.Data_value == df_max.Data_Value.max()]

Я думаю, код - это самоочевидный код.

0 голосов
/ 10 января 2019

Делает ли это то, что вы хотите?

df3 = df1.merge(df2.groupby('Month').agg({'Data_Value':'max'}).reset_index(), 
                on = 'Month', how='inner')
df3[df3.Data_Value_x > df3.Data_Value_y]

   Month  Data_Value_x  Data_Value_y
0     1         217.0            22
2     4         306.0           183
4     6         406.0           233
...