pandas按列条件在两个DataFrame间交换行出现NaN的原因及解决方法
错误成因
pandas在执行DataFrame之间的赋值操作时,会默认同时匹配行索引和列名,只有两边索引和列名完全一致的位置才会正常赋值,其他位置会自动填充NaN。
你的测试代码中:
- df1筛选出的
x==1的行,行索引为0 - df2筛选出的
x==323212的行,行索引为1
两者行索引不匹配,所以赋值后目标行全部为NaN。
实现基于指定列值的行交换操作
可以实现,只要破坏pandas的索引匹配逻辑,或者手动对齐索引即可,最简便的方式是提取右侧赋值对象的底层numpy数组(不带索引信息)进行赋值:
import pandas as pd df1 = pd.DataFrame({'x': [1, 2, 3], 'y': [3, 4, 5]}) df2 = pd.DataFrame({'x': [3223, 323212, 13242], 'y': [41233, 54, 5532]}) # 先保存df1目标行的临时副本 temp_row = df1[df1["x"] == 1].copy() # 给df1赋值,用.values取数组跳过索引匹配 df1.loc[df1["x"] == 1, :] = df2.loc[df2["x"] == 323212, :].values # 给df2赋值完成交换 df2.loc[df2["x"] == 323212, :] = temp_row.values print(df1) print(df2)
注意赋值时优先用loc显式指定行和列范围,避免pandas的链式索引警告。
内容的提问来源于stack exchange,提问作者pinholeye
相关产品推荐
相关产品推荐

