You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按条件交换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

操作说明

  1. 掩码定位:用isna().all(axis=1)判断每行的name、x、y是否全部为空,得到布尔数组mask精准锁定需要处理的行。
  2. 原子性交换:通过loc同时定位目标行和列,一次性完成双向赋值交换,既保证了操作效率,又避免了拆分DataFrame的繁琐流程。

执行后,原DataFrame中符合条件的行,name/x/y与name_2/x_2/y_2的数据会互换,其余行保持原样。

内容的提问来源于stack exchange,提问作者LiAfe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 18:50:24