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

使用Pandas读取CSV时,基于fix_nam列条件行移位问题求助

问题分析与解决方案

你的代码存在三个核心问题导致输出无变化:

1. 判断逻辑无效

pandas默认会将CSV中的文本内容(包括时间格式的字符串,如22:18:47)识别为字符串类型,因此not isinstance(row['fix_nam'], str)永远返回False,不会触发移位操作。

2. 移位方向完全错误

当前代码返回[None] + list(row[:-1]),实际是将整行向左移位(覆盖了原Idx列的值),而你需要的是向右移位,让缺失的fix_nam列补空,后续列回到正确位置。

3. CSV读取的潜在问题

使用delimiter=' '只能识别单个空格作为分隔符,若数据存在连续空格会导致字段分割错误,建议改用sep='\s+'匹配任意数量的空格。


修正后的代码

import os
import pandas as pd
import re

cwd = os.getcwd()
file_path = os.path.join(cwd, 'test.csv')

# 读取CSV:用任意数量空格做分隔符,跳过前2行,第3行作为表头
data = pd.read_csv(file_path, sep='\s+', skiprows=2, index_col=False)

# 清理列名空格
data.columns = data.columns.str.strip()

# 匹配HH:MM:SS格式的正则表达式
time_pattern = re.compile(r'^\d{2}:\d{2}:\d{2}$')

def fix_misaligned_row(row):
    fix_nam_val = row['fix_nam']
    # 检查值是否为时间格式(排除空值)
    if pd.notna(fix_nam_val) and time_pattern.match(str(fix_nam_val)):
        # 向右移位:fix_nam列设为空,后续列依次取原行前一列的值
        row[3:] = row[2:-1].values
        row['fix_nam'] = None
    return row

# 应用修正逻辑到每一行
data = data.apply(fix_misaligned_row, axis=1)

# 保存结果
output = os.path.join(cwd, 'testoutput2.csv')
data.to_csv(output, index=False)

print(data.head())

关键修正说明

  • 时间格式判断:用正则表达式^\d{2}:\d{2}:\d{2}$精准匹配时间格式的字符串,替代无效的类型判断。
  • 正确移位逻辑:通过row[3:] = row[2:-1].values将fix_nam及之后的列整体右移一位,fix_nam列设为None,完美修正错位问题。
  • 高效处理:使用DataFrame.apply替代iterrows,处理大文件时性能更优。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 20:14:58