计算在另一个数据帧中的事件之前,在一个数据帧中发生的事件数

2024-03-29 11:35:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个包含事件列表的数据帧。例如,df1看起来像:

Person ID Date of event

a         01/01/2016 13:30

a         01/02/2016 18:35

b         07/07/2016 12:15

b         07/08/2016 19:15

Df2看起来很相似,但有一个不同事件的列表,例如:

Person ID   Date of event2

a           01/12/2015 15:15

b           07/12/2015 18:15

b           11/12/2015 14:05

b           01/01/2017 16:30

我需要做的是在df1中有一个列,显示在df1中的日期之前,personid在df2中参与的事件数。你知道吗

上述装置的预期输出为:

Person ID   Date of event 1 Number of events from DF2

a           01/01/2016       1

a           01/02/2016       1

b           07/07/2016       2

b           07/08/2016       2

我尝试了很多方法,并怀疑答案与df2上的pivot表有关,并将结果合并到df1中,但我似乎不能完全正确地理解这一点。你知道吗

非常感谢您的帮助!你知道吗


Tags: of数据eventidnumber列表date事件
2条回答

您可以通过将personId上的数据帧合并在一起,进行筛选,然后计数来实现这一点。你知道吗

df1 = pd.DataFrame([['a', '01/01/2016 13:30'],
                   ['a', '01/02/2016 18:35'],
                   ['b', '01/07/2016 12:15'],
                   ['b', '01/08/2016 19:15']],
                  columns=['PersonId', 'EventDate'])

df1['EventDate'] = pd.to_datetime(df1['EventDate'])

df2 = pd.DataFrame([['a', '01/12/2015 15:15'],
                   ['b', '07/12/2015 18:15'],
                   ['b', '11/12/2015 14:05'],
                   ['b', '01/01/2017 16:30']],
                  columns=['PersonId', 'EventDate'])

df2['EventDate'] = pd.to_datetime(df2['EventDate'])

df_temp = df1.merge(df2, on=["PersonId"], suffixes=("_event1", "_event2"))
df_temp = df_temp[df_temp.loc[:, 'EventDate_event1'] > df_temp.loc[:, 'EventDate_event2']]
df_temp = df_temp.groupby(['PersonId', 'EventDate_event1'], as_index=False).count()
print(df_temp)

得到

  PersonId    EventDate_event1  EventDate_event2
0        a 2016-01-01 13:30:00                 1
1        a 2016-01-02 18:35:00                 1
2        b 2016-01-07 12:15:00                 2
3        b 2016-01-08 19:15:00                 2

使用apply()选择符合您的条件的df2数据,然后使用len()获取大小。确保使用pd.to_datetime()将日期转换为datetime。见下表:

df1和df2准备:

df1 = pd.DataFrame([['a','01/01/2016 13:30'],
                    ['a','01/02/2016 18:35'],
                    ['b','07/07/2016 12:15'],
                    ['b','07/08/2016 19:15']], columns=['id','date1'] )
df1['date1'] = pd.to_datetime(df1['date1'])

df2 = pd.DataFrame([['a','01/12/2015 15:15'],
                    ['b','07/12/2015 18:15'],
                    ['b','11/12/2015 14:05'],
                    ['b','01/01/2017 16:30']], columns=['id','date2'] )
df2['date2'] = pd.to_datetime(df2['date2'])

代码:

df1['count'] = df1.apply(lambda x: len(df2[(df2.date2 <= x.date1)&(df2.id==x.id)]),
                         axis='columns')

结果:

i. id          date1         count
0  a 2016-01-01 13:30:00      1
1  a 2016-01-02 18:35:00      1
2  b 2016-07-07 12:15:00      2
3  b 2016-07-08 19:15:00      2

相关问题 更多 >