是否可以对数据帧中的行的条件计数使用矢量化?

2024-10-01 07:14:05 发布

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

我有一个关于通话的数据框。每个呼叫都有一个唯一的ID,每个客户都有一个ID(但可以有多个呼叫)。第三栏是一天。对于每个客户,我要计算7天内的最大通话次数。你知道吗

我一直在使用以下代码计算每行通话后7天内的通话次数:

df['ContactsIN7Days'] = df.apply(lambda row: len(df[(df['PersonID']==row['PersonID']) & (abs(df['Day'] - row['Day']) <=7)]), axis=1)

输出:

CallID  Day PersonID    ContactsIN7Days
6       2   3           2
3       14  2           2
1       8   1           1
5       1   3           2
2       12  2           2
7       100 3           1

这是可行的,但是这将应用于大数据集。有没有办法提高效率。通过矢量化?你知道吗


Tags: 数据lambda代码iddf客户lenabs
1条回答
网友
1楼 · 发布于 2024-10-01 07:14:05

这是一个复杂的问题,但我认为有效的解决方案。请注意,您的数据帧的顺序因此被修改,Day列被修改为timedelta数据类型:

从数据帧df开始:

   CallID  Day  PersonID
0       6    2         3
1       3   14         2
2       1    8         1
3       5    1         3
4       2   12         2
5       7  100         3

首先将Day修改为timedelta序列:

df['Day'] = pd.to_timedelta(df['Day'], unit='d')

然后,使用^{},将数据帧与7天内每个人的调用计数合并。要获得此结果,请使用频率为7天的groupby^{}

new_df = (pd.merge_asof(df.sort_values(['Day']),
                        df.sort_values(['Day'])
                        .groupby([pd.Grouper(key='Day', freq='7d'), 'PersonID'])
                        .size()
                        .to_frame('ContactsIN7Days')
                        .reset_index(),
                        left_on='Day', right_on='Day',
                        left_by='PersonID', right_by='PersonID',
                        direction='nearest'))

结果new_df如下所示:

   CallID      Day  PersonID  ContactsIN7Days
0       5   1 days         3                2
1       6   2 days         3                2
2       1   8 days         1                1
3       2  12 days         2                2
4       3  14 days         2                2
5       7 100 days         3                1

相关问题 更多 >