python,pandas,处理坏数据

时间:2016-10-20 13:58:43

标签: python pandas data-cleaning

所以我有一个非常大的数据框,主要是浮点数(从csv读取)但是偶尔会得到一个字符串,或者是

                         date load
0  2016-07-12 19:04:31.604999    0
...
10 2016-07-12 19:04:31.634999    nan
...
50 2016-07-12 19:04:31.664999    ".942.197"
...

我可以处理nans(interpolate),但是无法弄清楚如何使用replace来捕获字符串,而不是数字

df.replace(to_replace='^[a-zA-Z0-9_.-]*$',regex=True,value = float('nan'))

返回所有nans。只有当它实际上是一个字符串

时,我才会这样做

2 个答案:

答案 0 :(得分:2)

我想你想要pandas.to_numeric。它适用于类似系列的数据。

In [1]: import pandas as pd

In [2]: df = pd.DataFrame([0, float('nan'), '.942.197'], columns=['load'])

In [3]: df
Out[3]: 
       load
0         0
1       NaN
2  .942.197

In [4]: pd.to_numeric(df['load'], errors='coerce')
Out[4]: 
0    0.0
1    NaN
2    NaN
Name: load, dtype: float64

实际上to_numeric会尝试将每个项目转换为数字,因此如果您有一个看起来像数字的字符串,它将被转换:

In [5]: df = pd.DataFrame([0, float('nan'), '123.456'], columns=['load'])

In [6]: df
Out[6]: 
      load
0        0
1      NaN
2  123.456

In [7]: pd.to_numeric(df['load'], errors='coerce')
Out[7]: 
0      0.000
1        NaN
2    123.456
Name: load, dtype: float64

我不知道有什么方法可以将每个非数字类型转换为nan,而不是迭代(或者可能使用applymap)并检查{{1} }。

答案 1 :(得分:0)

我的理解是.replace()仅适用于字符串数据类型。如果将它应用于非字符串数据类型(例如,您的数字类型),它将返回nan。在使用替换之前将整个帧/系列转换为字符串可以解决这个问题,但可能并不是最好的#34;这样做的方式(例如,见@ Goyo'答案)!

请参阅this页面上的说明。