根据发病日期和地址,我正在寻找在同一地点发生在彼此指定时间范围内的疾病爆发.数据帧很大-300K行.

有一个很好的解决方案,可以通过Jezrael在每行日期之前或之后的指定天数内匹配日期(我不确定这是否可以处理300K行):

import pandas as pd

df = pd.DataFrame(
    [
        ['2020-01-01 10:00', '1', 'A'],
        ['2020-01-01 10:01', '2', 'A'],
        ['2020-01-01 10:02', '3a', 'A'],
        ['2020-01-01 10:02', '3b', 'B'],
        ['2020-01-01 10:30', '4', 'B'],
        ['2020-01-01 10:50', '5', 'B'],
        ['2020-01-01 10:54', '6', 'B'],
        ['2020-01-01 10:55', '7', 'B'],
    ], columns=['event_time', 'event_id', 'Address']
)

# solution matching dates within range of date in row by jezrael
df['event_time'] = pd.to_datetime(df['event_time'])

td = pd.Timedelta("1m")
f = lambda x, y: df.loc[df['event_time'].between(y - td, y + td),
                        'event_id'].drop(x).tolist()
df['related_event_id_list'] = [f(k, v) for k, v in df['event_time'].items()]
print (df)
           event_time event_id related_event_id_list  Address
0 2020-01-01 10:00:00        1                   [2]     A
1 2020-01-01 10:01:00        2           [1, 3a, 3b]     A
2 2020-01-01 10:02:00       3a               [2, 3b]     A
3 2020-01-01 10:02:00       3b               [2, 3a]     B
4 2020-01-01 10:30:00        4                    []     B
5 2020-01-01 10:50:00        5                    []     B
6 2020-01-01 10:54:00        6                   [7]     B
7 2020-01-01 10:55:00        7                   [6]     B

我已try 将该地址包括在原始比较中,但没有成功.我不确定如何在整个Related_Event_id_list(?)之间比较地址,或者首先匹配地址(减少行数),然后根据输出调整Jezrael解决方案是否更好?

输出应该允许我计算事件的开始日期、结束日期和地址.首先,调整Jezrael解决方案,它将是:

           event_time event_id related_event_id_list  Address
0 2020-01-01 10:00:00        1                   [2]     A
1 2020-01-01 10:01:00        2               [1, 3a]     A
2 2020-01-01 10:02:00       3a                   [2]     A
3 2020-01-01 10:02:00       3b                    []     B
4 2020-01-01 10:30:00        4                    []     B
5 2020-01-01 10:50:00        5                    []     B
6 2020-01-01 10:54:00        6                   [7]     B
7 2020-01-01 10:55:00        7                   [6]     B

但由于前三行(以及最后两行)代表的是一场持续的疫情,因此解决方案实际上更像是:

     event_time_start  event_time_end     events_and_related_event_id_list  Address
0 2020-01-01 10:00:00  2020-01-01 10:02:00        [1, 2, 3a]     A
6 2020-01-01 10:54:00  2020-01-01 10:55:00        [6, 7]         B

推荐答案

您可以按组使用此解决方案:

# solution matching dates within range of date in row by jezrael
df['event_time'] = pd.to_datetime(df['event_time'])

def f(g):
    td = pd.Timedelta("1m")
    f = lambda x, y: g.loc[g['event_time'].between(y - td, y + td),
                            'event_id'].drop(x).tolist()
    g['related_event_id_list'] = [f(k, v) for k, v in g['event_time'].items()]
    return g

df  = df.groupby('Address').apply(f)
print (df)
           event_time event_id Address related_event_id_list
0 2020-01-01 10:00:00        1       A                   [2]
1 2020-01-01 10:01:00        2       A               [1, 3a]
2 2020-01-01 10:02:00       3a       A                   [2]
3 2020-01-01 10:02:00       3b       B                    []
4 2020-01-01 10:30:00        4       B                    []
5 2020-01-01 10:50:00        5       B                    []
6 2020-01-01 10:54:00        6       B                   [7]
7 2020-01-01 10:55:00        7       B                   [6]

对于下一步,使用GroupBy.agg表示由related_event_id_list列中的连续非空列表值创建的组:

m = df['related_event_id_list'].astype(bool)

f1 = lambda x: list(dict.fromkeys([z for y in x for z in y]))

df = (df[m].groupby([(~m).cumsum(),'Address'])
           .agg(event_time_start=('event_time','min'),
                event_time_end=('event_time','max'),
                events_and_related_event_id_list=('related_event_id_list',f1))
           .droplevel(0)
           .reset_index())
print (df)
  Address    event_time_start      event_time_end  \
0       A 2020-01-01 10:00:00 2020-01-01 10:02:00   
1       B 2020-01-01 10:54:00 2020-01-01 10:55:00   

  events_and_related_event_id_list  
0                       [2, 1, 3a]  
1                           [7, 6]  

Python相关问答推荐

Pandas 填充条件是另一列

scikit-learn导入无法导入名称METRIC_MAPPING64'

发生异常:TclMessage命令名称无效.!listbox"

Python虚拟环境的轻量级使用

OR—Tools CP SAT条件约束

当点击tkinter菜单而不是菜单选项时,如何执行命令?

需要帮助重新调整python fill_between与数据点

在Python中使用if else或使用regex将二进制数据如111转换为001""

如何在Pyplot表中舍入值

如何在Great Table中处理inf和nans

30个非DATETIME天内的累计金额

在用于Python的Bokeh包中设置按钮的样式

一个telegram 机器人应该发送一个测验如何做?""

jsonschema日期格式

Js的查询结果可以在PC Chrome上显示,但不能在Android Chrome、OPERA和EDGE上显示,而两者都可以在Firefox上运行

如何在Airflow执行日期中保留日期并将时间转换为00:00

如何使用pytest在traceback中找到特定的异常

Python:从目录内的文件导入目录

将像素信息写入文件并读取该文件

如何在Python中实现高效地支持字典和堆操作的缓存?