首先,我提前为下面的格式表示歉意,对于我的一生,我无法弄清楚如何让这个表单接受我的代码,它不断地推送一个错误,我似乎没有格式化我的一些代码正确,但我找不到格式错误。
对于这个问题,我有两个数据集需要迭代,
数据集一包含两列,第一列是唯一标识号(ID)。第二列保存每个识别号的数据框。
每个 ID Data Fame 包含一个 Date 列和一个 Status 列,默认设置为 1(代表 false)
数据集二包含 ID 列以及开始日期和结束日期。
最终结果是迭代拉取其数据框的唯一 ID,并检查列出的每个日期是否是数据集二中具有匹配 ID 的对应事件。如果存在,则检查当前日期是否在开始日期和结束日期之间,如果是,则将 1 更改为 0(代表 True)
我需要返回的是数据集,其中每个唯一 ID 的数据框设置为显示哪些日期发生了该 ID 的事件。
数据集一个示例,命名法对于下面的代码并不完全准确
索引 身份证 状态 0 1 [日期栏、状态栏] 1 2 [日期栏、状态栏] 2 3 [日期栏、状态栏]
数据集二示例,命名法对于下面的代码并不完全准确
索引 身份证 开始日期 结束日期 0 1 日期 日期 1 2 日期 日期 2 3 日期 日期 3 2 日期 日期 4 4 日期 日期 5 1 日期 日期
我可以让下面的代码工作,它返回我正在寻找的内容,问题是扩展。我有超过 20,000 个 ID、180,000 个单独事件,需要检查五年的日期以确定每天该 ID 是否有事件。
我当前使用的是嵌套循环和我定义的一些用于进行逻辑检查的函数。如果我只输入几行,它就可以工作,但是当我尝试运行完整的数据集时,它需要几个小时(在手动停止之前我让它运行了 12 个多小时,我从来没能让它运行完成)
我已经阅读了使用 where() 或 mask() 并尝试将 apply() 与数据框一起使用,但无法弄清楚如何传递正确的索引以获得所需的结果。
我也读过向量化,但我对 python 仍然太新且缺乏经验,无法理解如何应用于这个问题。不过,两者都应该是可行的,并且比使用 python for 循环快几个数量级。
我错过了什么吗?有没有一种简单的方法可以迭代数据帧,而不需要 for 循环所需的长时间处理时间。
def check_ID(id, id_event):
cs = pd.DataFrame(date_status.loc[ id:id,].drop(columns=['status']))
event_id = pd.DataFrame(event_data.loc[ id_event:id_event,].drop(columns=['Begin Date','End Date','Consecutive_Days']))
if cs.equals(event_id):
return(True)
else:
return(False)
def is_event_true(id_index, id_event_index, date_index):
if (date_status.loc[id_index,'status'].loc[date_index,'Date'] >= event_data.loc[id_event_index,'Begin Date'] and date_status.loc[id_index,'status'].loc[date_index,'Date'] < event_data.loc[id_event_index,'End Date']):
return(True)
else:
return(False)
for i in date_status.index:
for x in event_data.index:
if check_ID(i,x):
for y in date_status.loc[i,'status'].index:
if is_event_true(i,x,y):
date_status.loc[i,'status'].loc[y,'Status'] = 0
如果您希望加快数据帧迭代速度,则需要并行化。
并行化的一些选项:
1.joblib
2.并发.futures
3.dask - 用于更大的数据