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

如何遍历DataFrame,在colA≠colC时下移colC与colD列?

解决方案

首先分析你原代码的问题:

  • 缩进错误:if语句后的代码没有缩进,导致逻辑不生效
  • 错误赋值:每次触发条件时,直接将df替换为colC列移位后的结果,丢失了其他列数据,最终得到的自然不是预期的DataFrame
  • iterrows逐行操作效率低,且在迭代过程中修改原DataFrame容易引发不可控问题

以下是符合需求的实现代码:

import pandas as pd
import numpy as np

# 构造原始DataFrame
df = pd.DataFrame({
    'colA': ['A', 'A', 'B', 'B'],
    'colB': ['foo', 'foo', 'yes', 'yes'],
    'colC': ['A', 'B', 'B', np.nan],
    'colD': ['foo', 'no', 'no', np.nan]
})

# 复制列以避免修改原数据(可选,视需求而定)
df['colC'] = df['colC'].copy()
df['colD'] = df['colD'].copy()

# 标记需要处理的行:colA不等于colC,且排除最后一行(无下一行可移)
mask = df['colA'] != df['colC']
mask.iloc[-1] = False

# 遍历需要处理的行,将当前行的colC、colD移到下一行,当前行置空
for idx in df[mask].index:
    df.loc[idx+1, ['colC', 'colD']] = df.loc[idx, ['colC', 'colD']]
    df.loc[idx, ['colC', 'colD']] = np.nan

# 对colC、colD列向下填充,填补最后一行的空值
df[['colC', 'colD']] = df[['colC', 'colD']].ffill()

print(df)

运行后输出结果:

colA colB colC colD
0    A  foo    A  foo
1    A  foo  NaN  NaN
2    B  yes    B   no
3    B  yes    B   no

逻辑说明

  1. 标记待处理行:筛选出colA != colC的行,同时排除最后一行(因为没有下一行可以移动值)
  2. 移动并置空:将待处理行的colC、colD值转移到下一行,当前行对应列置为空
  3. 向下填充:使用ffill()将最后一行的空值用前一行的有效值填充,符合你的期望结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 13:08:09