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

如何使用pandas.shift()下移行时不丢失数据、保留最后一行

pandas shift下移保留最后一行实现方案

核心逻辑

默认df.shift(1)会返回和原DataFrame长度一致的结果:首行补NaN,所有原有行下移1位,最后一行直接被丢弃。要实现「顶部补NaN、保留全部原始行」的效果,末尾追加NaN行再移位的思路完全可行,只需要在移位前给待处理的数据段追加1行全NaN值,移位后自然不会丢失原最后一行的数据。


具体实现

1. 全表下移1行不丢最后一行

import pandas as pd
import numpy as np

# 读取无表头csv,注意参数是header=None不是header=False
data = pd.read_csv('path/test.csv', header=None)

# 步骤:
# 1. 生成和原表列数一致的全NaN行
# 2. 拼接在原表末尾,重置索引
# 3. 执行下移1位操作
shifted_result = pd.concat(
    [data, pd.DataFrame([[np.nan]*data.shape[1]], columns=data.columns)],
    ignore_index=True
).shift(1)

针对给出的3行测试数据,执行后输出完全匹配预期:

0         1
0  NaN       NaN
1  example1  example1
2  example2  example2
3  example3  example3

2. 特定行段下移不丢最后一行

原有代码存在两个问题:

  • read_csv参数写错,header=False是无效参数,无表头场景要传header=None
  • 直接对选中的行段调用shift会因为长度不变丢失选中段的最后一行

修正写法和全表逻辑一致,只需要把待处理对象从全表换成选中的行段即可:

import pandas as pd
import numpy as np

data = pd.read_csv('path/test.csv', header=None)
# 选中需要移位的行段,示例为第2-3行(索引从0开始)
target_rows = data.iloc[1:3]

shifted_target = pd.concat(
    [target_rows, pd.DataFrame([[np.nan]*target_rows.shape[1]], columns=target_rows.columns)],
    ignore_index=True
).shift(1)

print(shifted_target)

执行后输出为:

0         1
0  NaN       NaN
1  example2  example2
2  example3  example3

注意事项

  • 如果不想导入numpy,可以把np.nan换成None,pandas会自动将空值识别为NaN类型
  • 拼接时必须加ignore_index=True重置索引,否则会因为索引重复导致移位结果不符合预期
  • 如果需要下移n行,就追加n行全NaN值,再调用shift(n)即可,逻辑完全通用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 06:45:31