Python:使用 for 循环更改原始数据

问题描述

我有一些非常大的 txt 文件 (> 2 gb),其中数据质量不佳。 在某些列(应该是整数)中,对于低于 1000.00 的值,'.'用作小数点(例如 473.71886),但对于 1000.00 以上的值,则形式类似于 7.541,72419。所以','用作小数点,'.'用作小数点。用于千位分隔符。

我已经使用 pd.read_csv 和以下命令读取了文本文件

df = pd.read_csv('mseg.txt',delimiter=("#|#"),nrows=(1000),engine = 'python')

我尝试构建要使用的正则表达式,但它不起作用 pattern = "[0-9]+[\.][0-9]+[,][0-9]+"

我正在考虑使用下面的代码来纠正上述问题,但它不起作用。 (在下面的代码中我用作 pattern2 = "," 来测试代码

for i in df.iloc[:,-5]:
    df3 = []
    if re.search(pattern2,i):
        k= i.replace(".","")
        print(k)
        df3.append(k)
    else:
        df3.append(k)
return dfe3

循环中的 print(k) 似乎工作正常,但是当我运行 df3 时,我得到以下输出

['\x00 \x003\x004\x00\x006\x006\x005\x00,\x002\x001\x007\x006\x000\x00']

有人可以帮忙吗?

先谢谢你!

解决方法

我建议执行以下操作:

如果数字中有“,”,则将其替换为“.”但是去掉之前的','。 因此,您可以将 1.234,567 更改为 1234,567,然后更改为 1234.567。 那么你所有的数字都应该采用相同的格式。

df3 = []
for index,i in df.iloc[:,-5]:  
    if ',' in i:
        i= i.replace(".","").replace(',','.')
    df3[index] = i
,

你可以试试这个:

>>> df
             0
0    473.71886
1  7.541,72419
>>> df[0].str.split(r'[^\d]') \
         .apply(lambda x: f"{''.join(x[:-1])}.{x[-1]}")

0      473.75410
1    71886.72419
dtype: float64