如何遍历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
逻辑说明
- 标记待处理行:筛选出
colA != colC的行,同时排除最后一行(因为没有下一行可以移动值) - 移动并置空:将待处理行的
colC、colD值转移到下一行,当前行对应列置为空 - 向下填充:使用
ffill()将最后一行的空值用前一行的有效值填充,符合你的期望结果
内容的提问来源于stack exchange,提问作者btroppo
相关产品推荐
相关产品推荐

