修正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)
代码逻辑说明
- 仅筛选
na1列非空的行进行处理,避免干扰正常行 - 在原7列的有效范围(第3列到第7列)内,定位第一个空列的位置
- 将该空列到
na1列之间的所有值向左移动一位,把空值补到na1列 - 完成移位后清空
na1列的原有数据
示例验证
输入行:
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | na1 | na2 |
|---|---|---|---|---|---|---|---|---|
| Z | G | 1964-06-22 | NaN | tt | tt | tt | tt | NaN |
处理后输出:
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | na1 | na2 |
|---|---|---|---|---|---|---|---|---|
| Z | G | 1964-06-22 | tt | tt | tt | tt | NaN | NaN |
内容的提问来源于stack exchange,提问作者Federicofkt
相关产品推荐
相关产品推荐

