
本文介绍如何在不修改特定列(如首列)的前提下,对 dataframe 中选定的若干列进行向左平移操作,并用空字符串填充右侧空缺,避免整行错位或数据丢失。
本文介绍如何在不修改特定列(如首列)的前提下,对 dataframe 中选定的若干列进行向左平移操作,并用空字符串填充右侧空缺,避免整行错位或数据丢失。
在 Pandas 中,df.shift() 默认作用于整个 DataFrame,若直接使用 df.shift(-1, axis=1) 会导致所有列整体左移——原第一列(如 'A')被挤出,第二列内容移入第一列位置,从而破坏关键标识列的完整性。这显然不符合需求:我们只想移动 'B' 和 'C' 列的内容(例如将 'B' 的值移至 'B'、'C' 的值移至 'B',原 'C' 列末尾补空),同时严格保留 'A' 列不变。
正确做法是显式指定目标列,单独对其应用 shift(),再赋值回原位置。关键在于结合列选择、axis=1(按列方向移动)、fill_value=''(用空字符串填充移出后产生的空位),并避免波及无关列:
import pandas as pd
# 构造原始 DataFrame
df = pd.DataFrame({
'A': ['First', 'Second'],
'B': ['row to delete', 'row to delete'],
'C': ['row to shift', 'row to shift']
})
# ✅ 正确:仅对 B、C 列执行左移,A 列完全保留
df[['B', 'C']] = df[['B', 'C']].shift(-1, axis=1, fill_value='')
print(df)
输出结果为:
A B C 0 First row to shift 1 Second row to shift
⚠️ 注意事项:
- shift(-1, axis=1) 表示“向左移动 1 列”(负号代表反向,即列索引减小);
- 必须指定 fill_value='',否则默认填 NaN,而空字符串更符合展示需求;
- 若只需对部分行生效(如仅第 2 行),可配合 .loc 精确定位:
idx = [1] # 第二行(0-indexed) cols = ['B', 'C'] df.loc[idx, cols] = df.loc[idx, cols].shift(-1, axis=1, fill_value='')
此外,也可使用 df.update() 实现相同效果(尤其适合就地更新且避免链式赋值警告):
df.update(df[['B', 'C']].shift(-1, axis=1, fill_value=''))
总结:永远优先显式选取列范围再操作,而非对整个 DataFrame 调用 shift()。这种模式既安全又可控,是处理混合语义列(如 ID 列 + 数据列)时的标准实践。











