我有一个像这样的条件数据框,其中大约有 300 行
pd.DataFrame({"PERSONALNR":["000009461","000009461"],"PERIODE":["202401","202402"],"MANDANT":["LB","LB"],"DA":["01","01"]})
其中“PERSONALNR”和“PERIODE”是我需要满足的条件,并且需要在第二个数据框中替换值“MANDANT”和“DA”
我想要替换的数据框与此类似,其中约有 110k 行
pd.DataFrame({"PERSONALNR":["000009461","000009461"],"PERIODE":["202401","202402"],"MANDANT":["LB","LB"],"DA":["01","01"], "KSTBEZ":["Springer pool","bla bla"]})
我想到的解决方案如下:
for row in POOL.itertuples():
LA.loc[(LA.PERSONALNR==row.PERSONALNR)&(LA.PERIODE==row.PERIODE)&(LA.DA=="01")&(LA.KSTBEZ.str.contains("pool")),["MANDANT","DA"]]=[row.MANDANT,row.DA]
我的解决方案对于上面的数据框来说效果很好——大约需要 10 秒钟左右才能完成,但我需要在具有 100 万行的数据框中执行相同的操作——大约需要 10 分钟......
谁能想出更好的解决办法?
假设 POOL 中没有重复的 PERSONALNR/PERIODE 组合。
您可以使用
merge
和布尔索引:输出(使用 POOL 中的 MANDANT/DA 值尾随进行
x
演示):为什么我们需要
reset_index
/set_index
?之后
merge
,索引丢失,这将无法与掩码正确对齐或无法分配给输入LA
。例子:
输出: