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

修正Pandas DataFrame行错位导致的列偏移问题

校正偏移的Pandas DataFrame列问题

问题描述

原本应包含7列的Pandas DataFrame实际有9列,原因是部分行向右偏移1-2列。列特征如下:

  • 前两列始终正常(第二列允许为空)
  • 第三列为日期,可能因偏移或本身为空
  • 第四、五列为城市名称,有时会混入第三列的日期,也可能为空
  • 最后两列(na1、na2)始终正常,但部分行的有效数据错误落入na1列

已尝试拆分列、遍历判断日期移位等方法,但na1列有值的行仍未校正,需求实现:将na1列有值的行从对应位置向左移位,直到遇到空列。

解决方案

通过定位目标行、逐行查找空列并移位的方式处理,代码实现如下:

import pandas as pd

# 构建示例DataFrame
data = {
    '1': ['Z'],
    '2': ['G'],
    '3': ['1964-06-22'],
    '4': [pd.NA],
    '5': ['tt'],
    '6': ['tt'],
    '7': ['tt'],
    'na1': ['tt'],
    'na2': [pd.NA]
}
df = pd.DataFrame(data)

# 筛选na1列非空的行
mask = df['na1'].notna()

# 逐行校正偏移
for idx in df[mask].index:
    row = df.loc[idx]
    # 在第3列到第7列范围内,查找第一个空值的列名
    empty_cols = row[row.isna() & row.index.isin(df.columns[2:-2])].index
    if not empty_cols.empty:
        first_empty = empty_cols[0]
        # 获取需要移位的列范围:从第一个空列到na1列
        col_start, col_end = df.columns.get_indexer_for([first_empty, 'na1'])
        cols_to_shift = df.columns[col_start:col_end+1]
        # 执行左移操作
        df.loc[idx, cols_to_shift[:-1]] = df.loc[idx, cols_to_shift[1:]].values
        # 清空na1列的原有值
        df.loc[idx, 'na1'] = pd.NA

print(df)

代码逻辑说明

  1. 仅筛选na1列非空的行进行处理,避免干扰正常行
  2. 在原7列的有效范围(第3列到第7列)内,定位第一个空列的位置
  3. 将该空列到na1列之间的所有值向左移动一位,把空值补到na1列
  4. 完成移位后清空na1列的原有数据

示例验证

输入行:

1234567na1na2
ZG1964-06-22NaNttttttttNaN

处理后输出:

1234567na1na2
ZG1964-06-22ttttttttNaNNaN

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 08:57:46