如何基于条件替换DataFrame中的数据并适配列顺序不一致的场景
问题描述
我有两个Pandas DataFrame:df1和df2,构造代码及数据如下:
import pandas as pd df1 = pd.DataFrame() df1['Cat'] = [0,1,2] df1['Mouse'] = [12,13,17] df1['Dog'] = [18,22,89]
df1的数据长这样:
Cat Mouse Dog 0 0 12 18 1 1 13 22 2 2 17 89
df2 = pd.DataFrame() df2['Cat'] = [0.94, 0.86, 0.04] df2['Mouse'] = [1,0.12,0.13] df2['Dog'] = [0.03,0.025,0.17]
df2的数据是这样:
Cat Mouse Dog 0 0.94 1.00 0.030 1 0.86 0.12 0.025 2 0.04 0.13 0.170
我的需求是:只有当df2对应位置的值小于0.05时,把df1对应位置的值替换成NaN,期望得到的结果如下:
Cat Mouse Dog 0 0.0 12 NaN 1 1.0 13 NaN 2 NaN 17 89.0
补充问题:如果df1和df2的列顺序不一样(比如df1是Cat、Dog、Mouse,df2是Dog、Mouse、Cat),代码该怎么改?
解决方案
场景1:df1和df2列顺序完全一致
这种情况最省心,直接用Pandas的布尔索引就能完成替换,代码超简洁:
# 先复制df1,避免修改原始数据 result_df = df1.copy() # 用布尔矩阵标记需要替换的位置,直接赋值为NaN result_df[df2 < 0.05] = pd.NA
运行后result_df就是你想要的结果。原理很简单:Pandas会自动对齐两个DataFrame相同位置的元素,df2 < 0.05会生成一个和原DataFrame形状一样的布尔矩阵,True的位置就是需要替换成NaN的地方,直接赋值就行。(用np.nan也可以,在数值列里效果和pd.NA一致)
场景2:df1和df2列顺序不一致
列顺序不同的话,关键是先让两个DataFrame的列对齐,再执行替换。我们可以用reindex()方法把df2的列调整成和df1一模一样的顺序,之后就和场景1的操作一样了:
# 模拟列顺序不一致的情况 df1 = df1[['Cat', 'Dog', 'Mouse']] df2 = df2[['Dog', 'Mouse', 'Cat']] # 复制原始df1 result_df = df1.copy() # 将df2的列重新对齐为df1的列顺序 aligned_df2 = df2.reindex(columns=df1.columns) # 执行替换操作 result_df[aligned_df2 < 0.05] = pd.NA
这样不管两个DataFrame的列怎么打乱,都能保证对应列的元素正确匹配,完美完成替换需求。
内容的提问来源于stack exchange,提问作者user16413457
相关产品推荐
相关产品推荐

