使用Pandas导入clinton1.dat时因多词名称列偏移,如何批量修复?
修复Pandas读取带空格地区名的数据集列偏移问题
这个问题我之前也碰到过,本质是你误解了原始文件的格式——它不是逗号分隔的CSV,而是**固定宽度格式(Fixed-Width Format)**的文件,直接改后缀成CSV然后用pd.read_csv()读取,自然会因为带空格的地区名被拆分成多列,导致整体列偏移。下面给你两种靠谱的解决方法:
方法一:直接读取原始.dat文件(推荐)
固定宽度文件的每一列都有固定的字符宽度,Pandas专门提供了pd.read_fwf()函数来处理这类文件,它会自动识别列的边界,完美解决带空格字段的拆分问题:
import pandas as pd # 直接读取公开的dat文件,无需转成csv clinton = pd.read_fwf("http://users.stat.ufl.edu/~winner/data/clinton1.dat")
如果自动识别列宽出现小问题,你可以先查看文件前几行的结构,手动指定列的范围:
# 先读取前5行,用repr()显示字符位置,方便确定列宽 with open("clinton1.dat", "r") as f: for _ in range(5): print(repr(f.readline()))
根据输出的字符位置,用colspecs参数指定每一列的起始和结束索引:
# 示例:假设地区名占0-19位,下一列占20-24位,以此类推 clinton = pd.read_fwf( "clinton1.dat", colspecs=[(0, 20), (20, 25), (25, 30)] # 替换成你实际观察到的列范围 )
方法二:修复已转成csv的文件(仅作备选)
如果你已经把文件转成了CSV,也可以通过预处理文本的方式合并被拆分的地区列。但注意:这个方法仅适用于所有地区名都是两个词的情况,如果存在单个词的地区名,会错误合并列:
import pandas as pd from io import StringIO # 读取已转好的csv文件内容 with open("C:/Users/Mateusz/Downloads/ML_DS-20180523T193457Z-001/ML_DS/clinton1.csv", "r") as f: lines = f.readlines() # 处理每一行:合并前两个空格分隔的部分作为地区名,其余部分保留 processed_lines = [] for line in lines: parts = line.strip().split() # 合并前两个元素为完整地区名 region = " ".join(parts[:2]) # 剩下的元素作为其他列 rest_columns = parts[2:] # 重新拼接成逗号分隔的行 processed_line = ",".join([region] + rest_columns) processed_lines.append(processed_line) # 用StringIO把处理后的文本转成可读取的对象,再用read_csv读取 clinton = pd.read_csv(StringIO("\n".join(processed_lines)))
总结来说,方法一直接处理原始固定宽度文件是最稳妥的,避免了格式转换带来的额外问题。
内容的提问来源于stack exchange,提问作者Mrowkacala
相关产品推荐
相关产品推荐

