簡體   English   中英

使用groupby和filter功能在多個條件下比較兩個數據幀

[英]Comparing two dataframes using multiple conditions with groupby and filter function

我有兩個數據框,每個數據框包含數據值和月份(這些是相關的列)。 第二個數據幀還包含在“元素”列下列出的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具有i。)3行屬於第2個月,其值分別為800、400和150。ii)4行屬於第5個月,其值分別為100、500、700、300和100。

新的數據框(df3)將; i。)包含行800和400,因為它們超過了與第二個月相對應的df_max中的194個最大值。
ii。)包含行500和700,因為它們超過了與第5個月相對應的df_max中的367值。

更新為了找到df2中可能超過df_max中每個月最大值的所有值,我決定使用groupby和nlargest來確定每個月的前3個溫度,並假設(基於觀察數據集)只有前3名將超過df_max中每月的最大值。 但是問題是輸出是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_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()]

我認為,代碼是不言自明的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM