优化python数据帧迭代循环



我有两个数据帧,df和ct

dfUNIT, START, END, CHECK是相关列。CHECK值均默认为"n"。我的代码测试它们,如果它们通过,则将此值更改为"y">

df.shape = 59155, 5
>结束查>>td style="ext-align:center;">43382.6736>>td style="ext-align:center;">43388.3465>>td style="text align:centre">43389.2979>44199.0009
单元DT小时数开始
0A70000.109743100.03211A70000.012543105.6621n
A70000.204243200.1214n
A70000.152143854.4500
A70020.145544198.5049n

根据经验:如果在数据帧上使用循环,90%的情况下,会出错

在您的情况下:

  • 与其进行for ... if,不如过滤数据帧:df[df["CHECK"] == "y"]
  • 您一直在为每一行过滤ct数据帧。您最好将此数据帧分组一次,然后将其转换为可以按单位访问的字典:
    • units = dict(list(ct.groupby("UNIT")))
    • for index in units[df_unit]: do_something()

这应该已经大大提高了的性能

我们可以使用以下步骤来解决问题

  • UNIT上的ct重置dfmerge的索引
  • 查询得到的合并数据帧,查找STARTEND中相应值满足包含条件的索引
  • 使用loc的布尔索引,使用上一步中获得的索引将CHECK列中的值更新为y
s  = df.reset_index().merge(ct, on='UNIT', suffixes=['', '_r'])
ix = s.query("START >= START_r and END <= END_r")['index']
df.loc[df.index.isin(ix), 'CHECK'] = 'y'

UNIT  DTHours       START         END CHECK
0  A7000   0.1097  43100.0321  43382.1417     n
1  A7000   0.0125  43105.6621  43382.6736     n
2  A7000   0.2042  43200.1214  43388.3465     y
3  A7000   0.1521  43389.2979  43854.4500     n
4  A7002   0.1455  44198.5049  44199.0009     n

最新更新