Группировать строки по двум столбцам и фильтровать значения по сравнению - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь:

  • создать новый фрейм данных (df2)
  • этот новый фрейм данных будет содержать строки из df1
  • чтобы добавить эти строки в df2 Я сгруппировал столбцы в df1 по месяцам и элементу
  • Я бы выбрал только значения, которые превышают их месячные одноранговые значения в df (например, если месяц 1 в df1 имеет 10 значений, которые превышают значение месяца 1 в df, я бы включил эти 10 значений в новый фрейм данных)

Сейчас я не могу сравнить значения каждой строки, сгруппированной по месяцам, с месячным эквивалентом в df (который содержит максимальные значения за месяц)

  • Я бы хотел выбрать только те строки из df1, значения которых превышают их месячные значения в df

Я получил решение от пользователя stackoverflow, которое позволяет мне получать максимальные значения для каждого месяца. Проблема в том, что в некоторых случаях в df1 имеется более двух значений, которые превышают эквивалент месяца в df.

Это код, который у меня есть:

df4 = df3[df3['Element'] =='TMAX'].groupby("Month").max()
df3_max = df4[df4.Data_Value > df_max.Data_Value]
df5 = df3[df3['Element'] =='TMIN'].groupby("Month").min()
df4_min = df5[(df5.Data_Value) < (df_min.Data_Value)]

Это df:

        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

df1 (выборка - полные данные имеют> 1000 строк):

    ID             Date   Element  Data_Value  Month
0   USW00094889 2014-11-12  TMAX    220.0   11.0
1   USC00208972 2009-04-29  TMAX    560.0   1.0
2   USC00200032 2008-05-26  TMAX    278.0   5.0
3   USC00205563 2005-11-11  TMAX    239.0   11.0
4   USC00200230 2014-02-27  TMAX    -106.0  2.0
5   USW00014833 2010-10-01  TMAX    194.0   10.0
6   USC00207308 2010-06-29  TMIN    144.0   6.0
7   USC00203712 2005-10-04  TMAX    289.0   10.0
8   USW00004848 2007-12-14  TMIN    -16.0   12.0
9   USC00200220 2011-04-21  TMAX    72.0    4.0
10  USC00205822 2013-01-16  TMAX    411.0   1.0
11  USC00205822 2008-05-29  TMIN    28.0    5.0
12  USC00203712 2008-10-17  TMIN    17.0    10.0
13  USC00205563 2006-05-14  TMAX    183.0   5.0

Это мой ожидаемый результат (df2):

        Data_Value
   Month    
    1.0   560.0
    1.0   411.0

Таким образом, из кадра данных df1 только 2-я и 11-я строки будут добавлены в df2, потому что значения этих строк превышают значения месяца 1 в df

1 Ответ

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

Используйте map для Series с таким же размером, как df2, поэтому можно сравнивать, только необходимые уникальные значения месяцев в df.index:

df3 = df1[df1['Data_Value'] > df1['Month'].map(df['Data_Value'])]
print (df3)
            vID        Date Element  Data_Value  Month
1   USC00208972  2009-04-29    TMAX       560.0    1.0
10  USC00205822  2013-01-16    TMAX       411.0    1.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...