pandas 替换表中的值

wqlqzqxt  于 2023-05-21  发布在  其他
关注(0)|答案(2)|浏览(149)

我有两张table。我需要用第一个表中的值替换第二个表中的值,前提是col 1和col 2中的数据相等,并且col 3表2中的值比col 3表1中的值小1。
表1:
| 色谱柱1|第2栏|第3栏|结果|
| --------------|--------------|--------------|--------------|
| 1|四|3|一一一|
| 5|七|六|二百二十二|
表2:
| 色谱柱1|第2栏|第3栏|结果|
| --------------|--------------|--------------|--------------|
| 1|四|四|三百三十三|
| 5|七|四十|四四四|
结果表2:
| 色谱柱1|第2栏|第3栏|结果|
| --------------|--------------|--------------|--------------|
| 1|四|四|一一一|
| 5|七|四十|四四四|
我试着关联相等性(table1.Column1 == table2.Column1 and table1.Column2 == table2.Column2 and table1.Column3 == table2.Column2 - 1)我试着使用iloc,但它在大量数据上工作了很长时间。怎样才能做到最好?提前感谢!

pcrecxhr

pcrecxhr1#

可以使用merge_asof

asof = pd.merge_asof(
        df2.sort_values(by="Column 3"), df1.sort_values(by="Column 3"),
        by=["Column1", "Column 2"], on="Column 3", tolerance=1,
        direction="backward", allow_exact_matches=False, suffixes=("_", "")
)

df2["result"] = asof["result"].fillna(df2["result"], downcast="infer")

输出:

print(df2)

   Column1  Column 2  Column 3  result
0        1         4         4     111
1        5         7        40     444
j8ag8udp

j8ag8udp2#

您可以在第三列减去1后使用pd.merge

df2['result'] = (df2.assign(**{'Column 3': df2['Column 3'].sub(1)})
                    .merge(df1, on=['Column1', 'Column 2', 'Column 3'], 
                                how='left', suffixes=(None, '_new'))['result_new']
                    .fillna(df2['result'], downcast='infer'))
print(df2)

# Output
   Column1  Column 2  Column 3  result
0        1         4         4     111
1        5         7        40     444

相关问题