按 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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...