
本文介绍如何在 pandas dataframe 中精准地对部分列(如 b 和 c 列)进行左移(shift)操作,同时保留特定列(如 a 列)完全不变,并正确填充空缺值。
本文介绍如何在 pandas dataframe 中精准地对部分列(如 b 和 c 列)进行左移(shift)操作,同时保留特定列(如 a 列)完全不变,并正确填充空缺值。
在数据处理中,经常需要对 DataFrame 的某些列进行位移操作(如左移一列),但默认的 `df.shift(-1, axis=1)` 会作用于**全部列**,导致首列(如 A)也被覆盖——这显然不符合需求。正确做法是**显式指定目标列**,再对其子集调用 `shift()`,并配合 `fill_value` 参数确保空位被合理填充(例如空字符串 `''`,而非默认的 `NaN`)。以下是最推荐、最清晰的实现方式:
# 仅对列 'B' 和 'C' 执行左移:B ← C,C → 空,A 列保持原样 df[['B', 'C']] = df[['B', 'C']].shift(-1, axis=1, fill_value='')
✅ 该语句含义明确:
- df[['B', 'C']] 提取目标列构成子 DataFrame;
- .shift(-1, axis=1) 表示沿列方向(水平)向左移动 1 位(负数表示左移);
- fill_value='' 确保右端新产生的空位填充为空字符串,避免出现 NaN;
- 最后通过赋值回写,仅更新 B、C 两列,A 列毫发无损。
你也可以将列名存为变量以提升可维护性:
cols_to_shift = ['B', 'C'] df[cols_to_shift] = df[cols_to_shift].shift(-1, axis=1, fill_value='')
⚠️ 注意事项:
- 不要使用 df.shift(-1, axis=1) 全局操作——它会破坏第一列;
- fill_value 参数至关重要:若省略,移出的值变为 NaN,且末列补 NaN,与预期空字符串不符;
- 若只需对某几行(如仅第 1 行)执行该操作,可结合 .loc 定位:
rows = [1] # 仅对索引为 1 的行操作 df.loc[rows, cols_to_shift] = df.loc[rows, cols_to_shift].shift(-1, axis=1, fill_value='')
此方法灵活、安全、语义清晰,是 Pandas 列级位移操作的最佳实践。


















