如何使用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
相关产品推荐
相关产品推荐

