【问题标题】:Python : Changing the original data using a for loopPython:使用 for 循环更改原始数据
【发布时间】:2021-09-18 02:32:21
【问题描述】:

我有一些非常大的 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']

有人可以帮忙吗?

提前谢谢你!

【问题讨论】:

    标签: python pandas for-loop data-quality


    【解决方案1】:

    你可以试试这个:

    >>> 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
    

    【讨论】:

      【解决方案2】:

      我建议执行以下操作:

      如果数字中有“,”,请用“。”替换它但摆脱','之前。 因此,您可以将 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
      

      【讨论】:

        猜你喜欢
        • 2020-08-28
        • 1970-01-01
        • 2022-12-31
        • 1970-01-01
        • 2020-09-19
        • 2019-08-20
        • 2010-09-20
        • 1970-01-01
        • 2012-05-20
        相关资源
        最近更新 更多