我有可以做到这一点的代码,但我使用iterrows()迭代数据帧的每一行.考虑到它要判断超过600万行,它需要相当长的时间来处理.并希望使用矢量化来加快速度.

我已经考虑了使用pd.Grouperfreq,但在如何使用这两个数据帧来进行判断方面遇到了困难.

给出以下两个数据帧:

我想查看df1(按'sid''modtype'分组)中的所有行:

df1:

   sid servid       date modtype service
0  123    881 2022-07-05      A1       z
1  456    879 2022-07-02      A2       z

然后在df2中找到它们,并在df1中计算这些组在该组的日期的3天内出现的次数,以获得该组在之前3天内出现的次数的计数,以及它在3天内出现的次数的计数.

df2:

    sid servid       date modtype
0   123   1234 2022-07-03      A1
1   123    881 2022-07-05      A1
2   123  65781 2022-07-06      A1
3   123   8552 2022-07-30      A1
4   123   3453 2022-07-04      A2
5   123   5681 2022-07-07      A2
6   456     78 2022-07-01      A1
7   456  26744 2022-05-05      A2
8   456  56166 2022-06-29      A2
9   456  56717 2022-06-30      A2
10  456    879 2022-07-02      A2
11  456     56 2022-07-25      A2

因此,基本上,在我下面提供的样例集中,我的输出将以:

   sid servid       date modtype service  cnt_3day_before   cnt_3day_after
0  123    881 2022-07-05      A1       z    1                 1
1  456    879 2022-07-02      A2       z    2                 0

Sample set:

import pandas as pd

data1 = {
    'sid':['123','456'],
    'servid':['881','879'],
    'date':['2022-07-05','2022-07-02'],
    'modtype':['A1','A2'],
    'service':['z','z']}

df1 = pd.DataFrame(data1)
df1['date'] = pd.to_datetime(df1['date'])
df1 = df1.sort_values(by=['sid','modtype','date'], ascending=[True, True, True]).reset_index(drop=True)



data2 = {
        'sid':['123','123','123','123','123','123',
               '456','456','456','456','456','456'],
        'servid':['1234','3453','881','65781','5681','8552',
                  '26744','56717','879','56166','56','78'],
        'date':['2022-07-03','2022-07-04','2022-07-05','2022-07-06','2022-07-07','2022-07-30',
                '2022-05-05','2022-06-30','2022-07-02','2022-06-29','2022-07-25','2022-07-01'],
        'modtype':['A1','A2','A1','A1','A2','A1',
                   'A2','A2','A2','A2','A2','A1']}

df2 = pd.DataFrame(data2)
df2['date'] = pd.to_datetime(df2['date'])
df2 = df2.sort_values(by=['sid','modtype','date'], ascending=[True, True, True]).reset_index(drop=True)

推荐答案

带注释的代码

# Merge the dataframes on sid and modtype
keys = ['sid', 'modtype']
s = df2.merge(df1[[*keys, 'date']], on=keys, suffixes=['', '_'])

# Create boolean condtitions as per requirements
s['cnt_3day_after']  = s['date'].between(s['date_'], s['date_'] + pd.DateOffset(days=3), inclusive='right')
s['cnt_3day_before'] = s['date'].between(s['date_'] - pd.DateOffset(days=3), s['date_'], inclusive='left' )

# group the boolean conditions by sid and modtype
# and aggregate with sum to count the number of True values
s = s.groupby(keys)[['cnt_3day_after', 'cnt_3day_before']].sum()

# Join the aggregated counts back with df1
df_out = df1.join(s, on=keys)

结果

print(df_out)

   sid servid       date modtype service  cnt_3day_after  cnt_3day_before
0  123    881 2022-07-05      A1       z               1                1
1  456    879 2022-07-02      A2       z               0                2

Python相关问答推荐

Pandas实际上如何对基于自定义的索引(integer和非integer)执行索引

如何使用Python将工作表从一个Excel工作簿复制粘贴到另一个工作簿?

类型错误:输入类型不支持ufuncisnan-在执行Mann-Whitney U测试时[SOLVED]

将图像拖到另一个图像

如何使用它?

如何让这个星型模式在Python中只使用一个for循环?

在含噪声的3D点网格中识别4连通点模式

给定高度约束的旋转角解析求解

无法连接到Keycloat服务器

使用特定值作为引用替换数据框行上的值

将scipy. sparse矩阵直接保存为常规txt文件

如何找出Pandas 图中的连续空值(NaN)?

ModuleNotFoundError:没有模块名为x时try 运行我的代码''

504未连接IB API TWS错误—即使API连接显示已接受''

Python日志(log)库如何有效地获取lineno和funcName?

利用SCIPY沿第一轴对数组进行内插

Scipy.linprog的可行性有问题吗?(A_ub@x0<;=b_ub).all()为True-但是-linprog(np.zeros_like(X0),A_ub=A_ub,b_ub=b_ub)不可行

对当前的鼹鼠进行编码,并且我的按键获得了注册

根据边界点的属性将图划分为子图

IpyWidget Select 框未打开