2017-06-18 106 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' –