我有两个数据帧,df和ct
df:UNIT, START, END, CHECK
是相关列。CHECK值均默认为"n"。我的代码测试它们,如果它们通过,则将此值更改为"y">
df.shape = 59155, 5
单元 | DT小时数 | 开始 | >结束查|||||||
---|---|---|---|---|---|---|---|---|---|
0 | A7000 | 0.1097 | 43100.0321 | >1 | A7000 | 0.0125 | 43105.6621 | >td style="ext-align:center;">43382.6736>n | |
A7000 | 0.2042 | 43200.1214 | >td style="ext-align:center;">43388.3465>n | ||||||
A7000 | 0.1521 | >td style="text align:centre">43389.297943854.4500 | |||||||
A7002 | 0.1455 | 44198.5049 | >44199.0009n |
根据经验:如果在数据帧上使用循环,90%的情况下,会出错
在您的情况下:
- 与其进行
for ... if
,不如过滤数据帧:df[df["CHECK"] == "y"]
- 您一直在为每一行过滤
ct
数据帧。您最好将此数据帧分组一次,然后将其转换为可以按单位访问的字典:units = dict(list(ct.groupby("UNIT")))
for index in units[df_unit]: do_something()
这应该已经大大提高了的性能
我们可以使用以下步骤来解决问题
- 用
UNIT
上的ct
重置df
和merge
的索引 - 查询得到的合并数据帧,查找
START
和END
中相应值满足包含条件的索引 - 使用
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