将行按两列分组并通过比较过滤值

时间:2019-01-11 06:16:40

标签: python pandas pandas-groupby

我正在尝试:

  • 创建一个新的数据框(df2)
  • 此新数据框将包含df1中的行
  • 要将这些行添加到df2中,我已经按月和元素df1​​中的列进行了分组
  • 我只会选择在df中超过其每月同等值的值(例如,如果df1中的第1个月具有超过df中的第1个月值的值,我会在新数据框中包含这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,因为这些行的值超过了df中第1个月的值

1 个答案:

答案 0 :(得分:4)

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