Python 使用groupby和filter函数使用多个条件比较两个数据帧
我有两个数据帧,每个数据帧包含数据值和月份(这些是相关列)。第二个数据帧还包含元素列下列出的TMIN(最小)和TMAX(最大)值 第一个数据框有12个条目,显示2005-2014年间某个月内发生的最高温度。我们称之为df_max 第二个数据框显示了2014年截止日期之后发生的温度。我们称之为df_2 我想创建第三个数据框,显示df2中的温度超过按月份分组的df_max中的温度 这些是df_max中的值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
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个月内都这样做-