python、pandas处理坏数据

python、pandas处理坏数据,python,pandas,data-cleaning,Python,Pandas,Data Cleaning,所以我有一个很大的数据帧,大部分是浮动的(从csv读取),但偶尔,我会得到一个字符串,或nan 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

所以我有一个很大的数据帧,大部分是浮动的(从csv读取),但偶尔,我会得到一个字符串,或nan

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

返回所有NaN。只有当它实际上是一个字符串的时候,我才想要nans。我想你想要的是熊猫。它可以处理类似于序列的数据

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

除了迭代(或者可能使用
apply
map
)和检查
isinstance
之外,我不知道有什么方法可以将每个非数字类型转换为
nan
,我的理解是
.replace()
只适用于字符串数据类型。如果将其应用于非字符串数据类型(例如,数字类型),它将返回nan。在使用replace之前将整个帧/系列转换为字符串可以解决这个问题,但这可能不是最好的方法(例如,请参见@Goyo的答案)


请参阅第页的注释。

你能发布一个“奇怪的东西”的例子吗?字符串是我唯一的问题,从我的问题中删除了“奇怪的东西”。这导致了992344的值(当我知道我的数据仅在0和1之间时,这是一个巨大的值),因此我不得不使用df=df进行后续操作[df@user2539738是的,我跳过了该部分,因为您的示例没有任何数字字符串。请参见编辑。如果您需要,我不知道如何以优雅而高效的方式将每个字符串转换为
nan