python、pandas,处理错误数据
python, pandas, work through bad data
所以我有一个非常大的数据框,主要是浮点数(从 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(插值),但不知道如何使用 replace 来捕获字符串,而不是数字
df.replace(to_replace='^[a-zA-Z0-9_.-]*$',regex=True,value = float('nan'))
returns 都是纳米。只有当它实际上是一个字符串时我才想要 nans
我想你想要 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
除了迭代(或者可能使用 apply
或 map
)并检查 isinstance
.
据我了解,.replace()
仅适用于 string 数据类型。如果您将它应用于非字符串数据类型(例如您的数字类型),它将 return nan。在使用替换之前将整个 frame/series 转换为字符串可以解决这个问题,但可能不是 "best" 这样做的方法(例如,请参阅@Goyo 的回答)!
请参阅 this 页上的注释。
所以我有一个非常大的数据框,主要是浮点数(从 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(插值),但不知道如何使用 replace 来捕获字符串,而不是数字
df.replace(to_replace='^[a-zA-Z0-9_.-]*$',regex=True,value = float('nan'))
returns 都是纳米。只有当它实际上是一个字符串时我才想要 nans
我想你想要 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
除了迭代(或者可能使用 apply
或 map
)并检查 isinstance
.
据我了解,.replace()
仅适用于 string 数据类型。如果您将它应用于非字符串数据类型(例如您的数字类型),它将 return nan。在使用替换之前将整个 frame/series 转换为字符串可以解决这个问题,但可能不是 "best" 这样做的方法(例如,请参阅@Goyo 的回答)!
请参阅 this 页上的注释。