Python pandas正确导入逗号加空格分隔txt数据的方法
问题根源
两个核心问题导致你导入和计算异常:
- 分隔符匹配逻辑错误:你的数据以逗号加不定长空格作为字段分隔,你之前写的固定长度空格匹配规则
sep=" "/sep=", "无法适配长度不固定的空格,自然会触发报错;不指定sep时pandas默认仅用逗号切分,会把数值前后的空格一并读入,导致数值列被识别为字符串(object类型),字符串类型无法计算皮尔逊相关系数,最终只会输出1.0和NaN的无效结果。 - 现有代码存在语法问题:
df.dropna没有加括号也没有重新赋值,根本不会执行空值删除操作;多余导入的tkinter.ttk.Separator和当前数据处理逻辑完全无关,可以删掉。
正确导入方案
pandas.read_csv的sep参数支持传入正则表达式,你只需要指定sep=r',\s*'即可匹配「逗号+0到任意个空白字符」的分隔规则,自动清理字段前后的多余空格,正确识别数值类型。
额外注意:你读取的是KNMI的etmgeg系列日值气象数据,文件开头默认有几十行带#的注释说明行,需要加skiprows参数跳过这些行,否则会把注释内容读入为数据行。
修正后代码
import pandas as pd # 读取数据 df = pd.read_csv( "etmgeg_235.txt", sep=r",\s*", # 正则匹配逗号+任意数量空格的分隔格式 skiprows=50, # 跳过开头注释行,数值可根据自己文件开头#号的实际行数调整 engine="python", # 使用正则分隔符时需要指定python解析引擎 na_values=[" "] # 可选,明确指定全空格的字段识别为空值 ) # 有效删除空值 df = df.dropna() # 计算相关系数矩阵,pandas新版本需要加numeric_only=True排除非数值列 cr = df.corr(numeric_only=True) print(cr)
校验方式
导入完成后先执行print(df.dtypes),如果所有气象数值字段的类型为int64或float64而非object,说明分隔符设置正确,此时计算出的相关系数矩阵就是正常结果。
内容的提问来源于stack exchange,提问作者Scott van Duin
相关产品推荐
相关产品推荐

