熊猫群组通过条件分组
我有两个数据帧,需要根据第二个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
优雅的解决方案?
有可能是一个更优雅的解决方案,但你可以通过在df2
的response_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)
想要.cut
method。这可以让你通过其他日期列表来清理日期。
df1['cuts'] = pd.cut(df1['response_date'], df2['response_date'])
grouped = df1.groupby('cuts')
print grouped.max() #for example
没有工作:'TypeError:不能比较datetime.timedelta int' –
这很聪明,但我认为你需要一个最短日期和一个最大日期,以避免丢失'df2范围外的值。 response_date' –
谢谢,但我故意避免在使用熊猫时使用循环。 –
@ArnoldKlein我同意尽量避免循环,尽管你不应该不加区分地排除它们。我喜欢@ Scott的解决方案,并稍微修改它以涵盖更多案例。根据您发布的数据,'response_date'似乎是'datetime'类型。您需要确保两个DataFrames列具有相同的数据类型。 –
我结束了您的解决方案与循环。我没有使用斯科特的建议得到一个很好的答案,稍后会进行探索,但在平均时间循环中效果很好。 –