2017-06-18 108 views
1

我有兩個數據幀,需要根據第二個df中的某些條件對第一個數據幀進行分組。熊貓羣組通過條件分組

df1= 
    summary participant_id response_date 
0  2.0    11 2016-04-30 
1  3.0    11 2016-05-01 
2  3.0    11 2016-05-02 
3  3.0    11 2016-05-03 
4  3.0    11 2016-05-04 
5  3.0    11 2016-05-05 
6  3.0    11 2016-05-06 
7  4.0    11 2016-05-07 
8  4.0    11 2016-05-08 
9  3.0    11 2016-05-09 
10  3.0    11 2016-05-10 
11  3.0    11 2016-05-11 
12  3.0    11 2016-05-12 
13  3.0    11 2016-05-13 
14  3.0    11 2016-05-14 
15  3.0    11 2016-05-15 
16  3.0    11 2016-05-16 
17  4.0    11 2016-05-17 
18  3.0    11 2016-05-18 
19  3.0    11 2016-05-19 
20  3.0    11 2016-05-20 
21  4.0    11 2016-05-21 
22  4.0    11 2016-05-22 
23  4.0    11 2016-05-23 
24  3.0    11 2016-05-24 
25  3.0    11 2016-05-25 
26  3.0    11 2016-05-26 
27  3.0    11 2016-05-27 
28  3.0    11 2016-05-28 
29  3.0    11 2016-05-29 
..  ...    ...   ... 

df2 = 
    summary participant_id response_date 
0  12.0    11 2016-04-30 
1  12.0    11 2016-05-14 
2  14.0    11 2016-05-28 
.  ...    ...   ...  

我需要一批在df2列日期間df1(獲取塊)。即:

df1= 
     summary participant_id response_date 
      2.0    11 2016-04-30 

      3.0    11 2016-05-01 
      3.0    11 2016-05-02 
      3.0    11 2016-05-03 
      3.0    11 2016-05-04 
      3.0    11 2016-05-05 
      3.0    11 2016-05-06 
      4.0    11 2016-05-07 
      4.0    11 2016-05-08 
      3.0    11 2016-05-09 
      3.0    11 2016-05-10 
      3.0    11 2016-05-11 
      3.0    11 2016-05-12 
      3.0    11 2016-05-13 
      3.0    11 2016-05-14 

      3.0    11 2016-05-15 
      3.0    11 2016-05-16 
      4.0    11 2016-05-17 
      3.0    11 2016-05-18 
      3.0    11 2016-05-19 
      3.0    11 2016-05-20 
      4.0    11 2016-05-21 
      4.0    11 2016-05-22 
      4.0    11 2016-05-23 
      3.0    11 2016-05-24 
      3.0    11 2016-05-25 
      3.0    11 2016-05-26 
      3.0    11 2016-05-27 
      3.0    11 2016-05-28 

      3.0    11 2016-05-29 
    ..  ...    ...   ... 

有沒有與groupby優雅的解決方案?

回答

2

有可能是一個更優雅的解決方案,但你可以通過在df2response_date值循環並通過檢查針對df1的所有response_date值,並簡單地總結他們都創造了一個布爾值系列。

df1['group'] = 0 
for rd in df2.response_date.values: 
    df1['group'] += df1.response_date > rd 

輸出:

summary participant_id response_date group 
0  2.0    11 2016-04-30  0 
1  3.0    11 2016-05-01  1 
2  3.0    11 2016-05-02  1 
3  3.0    11 2016-05-03  1 
4  3.0    11 2016-05-04  1 

大廈斷@斯科特的回答是:

您可以使用pd.cut但你需要的最早日期之前添加的日期和response_date最新的日期之後from df2

dates = [pd.Timestamp('2000-1-1')] + 
     df2.response_date.sort_values().tolist() + 
     [pd.Timestamp('2020-1-1')] 
df1['group'] = pd.cut(df1['response_date'], dates) 
+0

謝謝,但我故意避免在使用熊貓時使用循環。 –

+1

@ArnoldKlein我同意儘量避免循環,儘管你不應該不加區分地排除它們。我喜歡@ Scott的解決方案,並稍微修改它以涵蓋更多案例。根據您發佈的數據,'response_date'似乎是'datetime'類型。您需要確保兩個DataFrames列具有相同的數據類型。 –

+0

我結束了您的解決方案與循環。我沒有使用斯科特的建議得到一個很好的答案,稍後會進行探索,但在平均時間循環中效果很好。 –

1

想要.cut method。這可以讓你通過其他日期列表來清理日期。

df1['cuts'] = pd.cut(df1['response_date'], df2['response_date']) 
grouped = df1.groupby('cuts') 
print grouped.max() #for example 
+0

沒有工作:'TypeError:不能比較datetime.timedelta int' –

+0

這很聰明,但我認爲你需要一個最短日期和一個最大日期,以避免丟失'df2範圍外的值。 response_date' –