基于指定条件,用同结构第二个DataFrame修复第一个DataFrame数值
Pandas: Replace df1 values with df2 values where df2 is not -1
嘿,这个需求处理起来超简单,用Pandas的内置方法就能轻松搞定!先把你的示例数据贴出来方便大家理解:
import pandas as pd df1 = pd.DataFrame({'a' : [1,2,3], 'b' : [11,22,33], 'c' : [111,222,333]}) df2 = pd.DataFrame({'a' : [0,-1,-1], 'b' : [-1,-1,-1], 'c' : [1,2,-1]})
你的核心需求是:当df2中对应位置的数值不等于-1时,用df2的值替换df1的对应值;如果df2的值是-1,就保留df1原来的数值。
这里有两个非常直观的向量化方法可以实现,完全不用写循环:
方法1:使用df.where()
where()的逻辑很直白:当指定条件成立时,保留原DataFrame的值;条件不成立时,用另一个DataFrame的值替换。刚好匹配我们的需求:
result = df1.where(df2 == -1, df2) print(result)
方法2:使用df.mask()
mask()和where()是反向逻辑:当条件成立时,用另一个DataFrame的值替换原数据;条件不成立时保留原值。所以我们可以这样写:
result = df1.mask(df2 != -1, df2) print(result)
两种方法运行后都会得到你想要的结果:
a b c 0 0 11 1 1 2 22 2 2 3 33 333
简单唠唠逻辑:
- 方法1里,
df2 == -1会生成一个布尔矩阵,当df2的值是-1时为True,此时保留df1的数值;否则用df2的数值替换。 - 方法2里,
df2 != -1是我们要触发替换的条件,当这个条件为True时,就用df2的值替换df1的对应位置。
这两种方法都是Pandas的原生向量化操作,效率拉满,处理大规模数据也完全没问题~
内容的提问来源于stack exchange,提问作者Roman Kazmin
相关产品推荐
相关产品推荐

