如何按条件交换DataFrame指定列数据(禁止拆分拼接)
问题描述
给定如下示例DataFrame:
import numpy as np import pandas as pd data = [{"name": "test", "x": "test", "y": "test", "name_2": np.NaN, "x_2": np.NaN, "y_2": np.NaN}, {"name": "test", "x": "test", "y": "test", "name_2": np.NaN, "x_2": np.NaN, "y_2": np.NaN}, {"name": "test", "x": "test", "y": "test", "name_2": np.NaN, "x_2": np.NaN, "y_2": np.NaN}, {"name": "test", "x": "test", "y": "test", "name_2": "test", "x_2": "test", "y_2": "test"}, {"name": "test", "x": "test", "y": "test", "name_2": "test", "x_2": "test", "y_2": "test"}, {"name": "test", "x": "test", "y": "test", "name_2": "test", "x_2": "test", "y_2": "test"}, {"name": "test", "x": "test", "y": "test", "name_2": "test", "x_2": "test", "y_2": "test"}, {"name": np.NaN, "x": np.NaN, "y": np.NaN, "name_2": "test", "x_2": "test", "y_2": "test"}, {"name": np.NaN, "x": np.NaN, "y": np.NaN, "name_2": "test", "x_2": "test", "y_2": "test"}, {"name": np.NaN, "x": np.NaN, "y": np.NaN, "name_2": "test", "x_2": "test", "y_2": "test"}] df = pd.DataFrame(data) print(df)
需求:当name、x、y三列的值均为NaN时,交换这三列与name_2、x_2、y_2列的数据,且不能将DataFrame拆分为两个后再拼接。
解决方案
可以通过布尔索引定位目标行,直接完成列数据交换,无需拆分拼接:
# 生成布尔掩码:标记name、x、y全为NaN的行 mask = df[['name', 'x', 'y']].isna().all(axis=1) # 交换对应列的数据 df.loc[mask, ['name', 'x', 'y']], df.loc[mask, ['name_2', 'x_2', 'y_2']] = \ df.loc[mask, ['name_2', 'x_2', 'y_2']].values, df.loc[mask, ['name', 'x', 'y']].values
操作说明
- 掩码定位:用
isna().all(axis=1)判断每行的name、x、y是否全部为空,得到布尔数组mask精准锁定需要处理的行。 - 原子性交换:通过
loc同时定位目标行和列,一次性完成双向赋值交换,既保证了操作效率,又避免了拆分DataFrame的繁琐流程。
执行后,原DataFrame中符合条件的行,name/x/y与name_2/x_2/y_2的数据会互换,其余行保持原样。
内容的提问来源于stack exchange,提问作者LiAfe
相关产品推荐
相关产品推荐

