如何解决按 id1 和 id2 分组并使用另一个数据框和日期应用函数
我的问题如下: 我有一个关于车祸 (id_accident) 和 PASSENGER 受害者 (id_victim) 和事故日期 (date1).
id_accident | id_victim | date_accident | ROL |
---|---|---|---|
123 | 23A | 2021/20/01 | 乘客 |
456 | 12B | 2020/19/08 | 乘客 |
111 | 41A | 2021/20/01 | 乘客 |
222 | 54B | 2020/19/08 | 乘客 |
我有另一个数据框 DF2 相同的车祸和更多 (id_accident) 和一般的受害者(可能是 ROLE_VICTIM = PASSENGER 或DRIVERS) 和事故日期 (date1)
id_accident | id_victim | date_accident | ROL |
---|---|---|---|
001 | 23A | 2020/20/19 | 乘客 |
002 | 12B | 2019/31/12 | 司机 |
003 | 41A | 2020/20/12 | 乘客 |
004 | 54B | 2020/20/07 | 司机 |
因此,我需要为每个 id_accident 和 id_passenger 查找该乘客是否在过去 3 个月内发生过事故,但现在作为 ROLE_VICTIM =DRIVER。
我的代码由两个循环和一个函数组成,该函数在这次事故的受害者是前一次事故的司机时搜索以前的事故。
def siniestros_anteriores(DF2,dni_victima,date_accident):
result = DF2.loc[(DF2.siniestro_fecha_ocurrencia >= date_accident- pd.timedelta(90,unit='d')) &
(DF2.siniestro_fecha_ocurrencia < date_accident) &
(DF2.poreservable_victima_dni == dni_victima) &
(DF2.poreservable_victima_condicion_desc =="DRIVER")]
if result.shape[0]==0:# si no encuentra nada--> no se activa la regla
return 0
else:
return 1
for id_sin in DF1.siniestro_id.unique():
df = DF1.loc[DF1.siniestro_id ==id_sin,:]
date_accident= df.loc[df.siniestro_id==id_sin,'siniestro_fecha_ocurrencia'].values[0]
for dni in df.poreservable_victima_dni.unique():
if (dni == "?") | (pd.isna(dni)):# si no hay dni--> directamente la regla es 0
result = [id_sin,dni,0]
else:
r = siniestros_anteriores(DF2,date_accident)
result = [id_sin,r]
results.append(result)
有没有有效的方法来解决这个问题?也许做一个 groupby + apply...但它不起作用...提前致谢!
解决方法
这看起来像经典的 SQL 问题。您需要什么样的输出格式?
我不得不将 DF2 的第一个日期更改为 Gender ENUM('M','F'),
以使熊猫能够识别它。
以下是使用 2020/20/01
pd.merge
现在df3等于
import pandas as pd
import numpy as np
from io import StringIO
df1 = pd.read_csv(StringIO("""id_accident id_victim date_accident ROL
123 23A 2021/20/01 PASSENGER
456 12B 2020/19/08 PASSENGER
111 41A 2021/20/01 PASSENGER
222 54B 2020/19/08 PASSENGER"""),sep="\s+",parse_dates=["date_accident"],dayfirst=True)
df2 = pd.read_csv(StringIO("""id_accident id_victim date_accident ROL
001 23A 2020/20/09 PASSENGER
002 12B 2019/31/12 DRIVER
003 41A 2020/20/12 PASSENGER
004 54B 2020/20/07 DRIVER"""),dayfirst=True)
df3 = df1.merge(df2,on="id_victim")
并根据您的条件过滤
id_accident_x id_victim date_accident_x ROL_x id_accident_y date_accident_y ROL_y
0 123 23A 2021/20/01 PASSENGER 1 2020/20/19 PASSENGER
1 456 12B 2020/19/08 PASSENGER 2 2019/31/12 DRIVER
2 111 41A 2021/20/01 PASSENGER 3 2020/20/12 PASSENGER
3 222 54B 2020/19/08 PASSENGER 4 2020/20/07 DRIVER
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。