首页 > 解决方案 > CSV 文件中的污染。值为千的列中的逗号

问题描述

我认为数据清理存在小问题。在随附的 CSV 文件中输入指向 CSV 的链接。有人在第 7 行的“长度英尺”列中添加了逗号。我指出了图片上的位置。在此处输入图像描述

 df=pd.read_csv('c:/2/runways.csv', error_bad_lines  = True)
 print(df)

 df=pd.read_csv('c:/2/runways.csv', thousands=',')
 print(df)

 df=pd.read_csv('c:/2/runways.csv', decimal = ',')

我知道上面的说明不起作用。数据清理的方法对我来说至关重要。请帮我。每一次帮助都会获得奖励(当我的声望超过 15 时)。

标签: python-3.xpandascsv

解决方案


我没有仔细查看数据文件,但它似乎遵循一个非常简单的模式:(#,#,"cccc",#,#...其中#是一个数字,c是一个字母数字字符)。

该模式可以相当容易地转换为正则表达式模式,例如:^(\d+,\d+,"[\dA-Z]{4}",)(\d+),(\d{3},\d+)此 RegEx 模式将检测在“airport_ident”和“surface”字段之间包含 3 组逗号分隔数字的行,更重要的是,它只会在第二个该组的数字正好是 3 位数长,因为这表明逗号旨在用作千位分隔符。

由于分组,您可以利用反向引用来替换千位分隔符。例如,在 Atom(文本编辑器)中弄乱了这个,我使用了 RegEx 替换模式$1$2$3,因为千位分隔符逗号不在第二个和第三个捕获组之外。在 python 中,这就像

import re

raw_lines = ""
with open('/path/to/file', 'r') as fh:
    raw_lines = fh.read()

cleaned_lines = re.sub(
        r'^(\d+,\d+,"[\dA-Z]{4}",)(\d+),(\d{3},\d+)',
        r'\1\2\3',
        raw_lines,
        re.IGNORECASE
)

也就是说,正如他的回答中所报告的那样,当我在文本编辑器中打开 CSV 文件时,我没有看到任何有问题的行。


推荐阅读