【问题标题】:Is it possible to use vectorization for a conditionnal count of rows in a Pandas Dataframe?是否可以对 Pandas Dataframe 中的行的条件计数使用矢量化?
【发布时间】:2023-03-30 22:35:01
【问题描述】:

我有一个 Pandas 数据框,其中包含有关通话的数据。每个呼叫都有一个唯一的 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

这可行,但是这将应用于大数据集。有没有办法让这更有效。通过矢量化?

【问题讨论】:

    标签: python pandas dataframe vectorization


    【解决方案1】:

    IIUC 这是一个令人费解的问题,但我认为可以有效解决您的问题。请注意,您的数据帧的顺序因此被修改,并且您的 Day 列被修改为 timedelta dtype:

    从你的数据框开始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')
    

    然后,使用pd.merge_asof,将您的数据框与每个人在 7 天内的调用次数合并。为此,请使用 groupbypd.Grouper,频率为 7 天:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 2021-04-04
      • 2021-02-07
      • 1970-01-01
      • 1970-01-01
      • 2021-01-18
      相关资源
      最近更新 更多