对于大数据,如何避免Pandas数据帧中的for循环

2024-09-30 02:29:12 发布

您现在位置:Python中文网/ 问答频道 /正文

你能告诉我一种优化代码的方法吗?由于数据集很大,需要几十分钟才能完成。。。在

df['sinistre'] = 0
for index_sin, row_sin in sinistre1.iterrows():
    date_surv = row_sin['DATESURV']
    quit_sin = df.loc[df['id_police'] == row_sin['id_police']]
    for index, row in quit_sin.iterrows():
        if row['DATEEFFE'] < date_surv < row['DATE_FIN']:
            df['sinistre'][index] = 1

以下是数据帧sinistre1df的示例数据集:

^{pr2}$

这是预期的输出(想法是当sinistre1中的DATESURV在区间DATEEFFE&;DATE_FIN内时,我标记sinistre):

  id_police    DATEEFFE    DATE_FIN  prime  prime2  sinistre
0      p123  24/01/2017  24/02/2017      0       0         0
1      p123  24/11/2017  24/12/2017      0      30         1
2      p123  25/02/2018  25/03/2018     10      10         1
3      b123  24/02/2018  24/03/2018     20      20         1
4      b123  24/03/2018  24/04/2018     30       0         0

如果我不能避免for循环,那么请给出一个更好的方法来更快地循环。。。提前谢谢!在


Tags: 数据方法iddffordateindexsin
3条回答

使用:

  1. 用于转换所有日期时间列的第一个函数^{}
  2. 为上次检查成员资格创建计数器列sinistre1
  3. ^{}leftjoin一起用于数据
  4. 使用inclusive=True^{}进行筛选,并只获得序列sinistre1中的列s
  5. 最后一次覆盖final sinistre1,方法是用^{}s进行检查,转换为整数到True/False到{}映射:

df['DATEEFFE'] = pd.to_datetime(df['DATEEFFE'])
df['DATE_FIN'] = pd.to_datetime(df['DATE_FIN'])
sinistre1['DATESURV'] = pd.to_datetime(sinistre1['DATESURV'])

df['sinistre1'] = np.arange(len(df))
df1 = df.merge(sinistre1, on='id_police', how='left')
mask = df1['DATESURV'].between(df1['DATEEFFE'], df1['DATE_FIN'], inclusive=False)
s = df1.loc[mask, 'sinistre1']
print (s)
4    1
8    2
9    3
Name: sinistre1, dtype: int32

df['sinistre1'] = df['sinistre1'].isin(s).astype(int)
#alternative
#df['sinistre1'] = np.where(df['sinistre1'].isin(s), 1, 0)
print (df)
  id_police   DATEEFFE   DATE_FIN  prime  prime2  sinistre1
0      p123 2017-01-24 2017-02-24      0       0          0
1      p123 2017-11-24 2017-12-24      0      30          1
2      p123 2018-02-25 2018-03-25     10      10          1
3      b123 2018-02-24 2018-03-24     20      20          1
4      b123 2018-03-24 2018-04-24     30       0          0

编辑:

^{pr2}$
  1. 左合并“id_police”列上的两个数据集
  2. 使用业务逻辑编写lambda函数并将其应用于合并的数据集

即(未测试):

t_table = pd.merge(sinistre1, df, how='left', on='id_police')
t_table['sinistre'] = [1 if row['DATEEFFE'] < ds< row['DATE_FIN'] else
0 for row,_ in t_table.iterrows()]

正如我在评论中所说。接受的答案和合并现在没有意义,因为我认为OP希望比较两个数据帧中的每一行,因此也需要数据帧df中的键id_sinistre。或希望使用combine_first如下所示:

df_merge = df.merge(sinistre1, on='id_police', how='left')
df_merge['DATESURV'] = pd.to_datetime(df_merge['DATESURV'])

df_merge['sinistre'] = np.where(df_merge['DATESURV'].between(df_merge['DATEEFFE'], df_merge['DATE_FIN']), 1, 0)

df_merge = df_merge.drop(['DATESURV', 'id_sinistre'], axis=1)

print(df_merge)
    DATEEFFE   DATE_FIN id_police  prime  prime2  sinistre
0 2017-01-24 2017-02-24      p123      0       0         0
1 2017-11-24 2017-12-24      p123      0      30         1
2 2018-02-25 2018-03-25      p123     10      10         1
3 2018-02-24 2018-03-24      b123     20      20         1
4 2018-03-24 2018-04-24      b123     30       0         0

相关问题 更多 >

    热门问题