Python 使用groupby和filter函数使用多个条件比较两个数据帧

Python 使用groupby和filter函数使用多个条件比较两个数据帧,python,pandas,pandas-groupby,data-science,Python,Pandas,Pandas Groupby,Data Science,我有两个数据帧,每个数据帧包含数据值和月份(这些是相关列)。第二个数据帧还包含元素列下列出的TMIN(最小)和TMAX(最大)值 第一个数据框有12个条目,显示2005-2014年间某个月内发生的最高温度。我们称之为df_max 第二个数据框显示了2014年截止日期之后发生的温度。我们称之为df_2 我想创建第三个数据框,显示df2中的温度超过按月份分组的df_max中的温度 这些是df_max中的值 Data_Value Month 1.0 217.0 2.0 1

我有两个数据帧,每个数据帧包含数据值和月份(这些是相关列)。第二个数据帧还包含元素列下列出的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'])
这将返回错误消息“TypeError:“str”对象不可调用”

期望的结果

因此,我期望的结果是:例如,假设df2在第2个月下有3行,它们的值分别为800、400和150。ii)第5个月下的4行,值为100、500、700、300和100

新的数据帧(df3)将:; i、 )包含第800行和第400行,因为它们超过了第2个月对应的df_max中的194最大值。
ii.)包含第500行和第700行,因为它们超过了第5个月对应的df_max中的367值

更新 为了找到df2中可能超过df_max中每个月最大值的所有值,我决定使用groupby和NLAGEST根据假设(基于观察数据集)确定每个月的前3个温度在df_max中,只有前3个会超过每月的最大值。但问题是输出是pd.series格式的,我不确定如何将每个月的值与df_max数据帧中的值进行比较

这是我写的代码

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\u Value”

这是否符合您的要求

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

我想,这就是你想要的

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

我认为,代码是自解释的代码。

.groupby[('Month')('Data\u Value')]
不是好语法。也许可以改为
.groupby['Month','Data_Value']
?是的,它毕竟效率很低,thx for Suggestion如果我错了请纠正我,但这不会找到每月df2值的最大值,并且只返回大于df_min Month等效值的值吗?可能我的问题措辞错误,因为我试图找到第2个月(df2)中低于df_min第2个月值的值,并将这些值添加到df3(所有12个月)中。请分享您示例的预期输出?这样就容易多了,不确定这是否有用,但例如,假设df2在第2个月下有i.)3行,它们的值分别为800、400和150。ii)第5个月下的4行,值为100、500、700、300和100。df3将包含值800和400(因为它们超过了df_max中的194个最大值)和(500和700),因为它们超过了df_max中的367个值。希望这有帮助吗?谢谢,但例如,我正在尝试查找第2个月(df2)中低于df_min第2个月值的所有值…我希望在所有12个月内都这样做-