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

