python - 将 pandas.Series 从 dtype 对象转换为 float ,将错误转换为 nans

标签 python pandas nan

考虑以下情况:

In [2]: a = pd.Series([1,2,3,4,'.'])

In [3]: a
Out[3]: 
0    1
1    2
2    3
3    4
4    .
dtype: object

In [8]: a.astype('float64', raise_on_error = False)
Out[8]: 
0    1
1    2
2    3
3    4
4    .
dtype: object

我希望有一个选项允许在将错误值(例如 .)转换为 NaN 时进行转换。有没有办法做到这一点?

最佳答案

使用 pd.to_numeric使用 errors='coerce'

# Setup
s = pd.Series(['1', '2', '3', '4', '.'])
s

0    1
1    2
2    3
3    4
4    .
dtype: object

pd.to_numeric(s, errors='coerce')

0    1.0
1    2.0
2    3.0
3    4.0
4    NaN
dtype: float64

如果需要填写NaN,请使用Series.fillna .

pd.to_numeric(s, errors='coerce').fillna(0, downcast='infer')

0    1
1    2
2    3
3    4
4    0
dtype: float64

注意,downcast='infer' 将尽可能尝试将 float 向下转换为整数。如果您不希望这样,请删除该参数。

From v0.24+, pandas introduces a Nullable Integer type, which allows integers to coexist with NaNs. If you have integers in your column, you can use

pd.__version__
# '0.24.1'

pd.to_numeric(s, errors='coerce').astype('Int32')

0      1
1      2
2      3
3      4
4    NaN
dtype: Int32

There are other options to choose from as well, read the docs for more.


DataFrames

的扩展

如果您需要将此扩展到 DataFrames,则需要将其应用到每一行。您可以使用 DataFrame.apply .

# Setup.
np.random.seed(0)
df = pd.DataFrame({
    'A' : np.random.choice(10, 5), 
    'C' : np.random.choice(10, 5), 
    'B' : ['1', '###', '...', 50, '234'], 
    'D' : ['23', '1', '...', '268', '$$']}
)[list('ABCD')]
df

   A    B  C    D
0  5    1  9   23
1  0  ###  3    1
2  3  ...  5  ...
3  3   50  2  268
4  7  234  4   $$

df.dtypes

A     int64
B    object
C     int64
D    object
dtype: object

df2 = df.apply(pd.to_numeric, errors='coerce')
df2

   A      B  C      D
0  5    1.0  9   23.0
1  0    NaN  3    1.0
2  3    NaN  5    NaN
3  3   50.0  2  268.0
4  7  234.0  4    NaN

df2.dtypes

A      int64
B    float64
C      int64
D    float64
dtype: object

您也可以使用 DataFrame.transform 来执行此操作;虽然我的测试表明这有点慢:

df.transform(pd.to_numeric, errors='coerce')

   A      B  C      D
0  5    1.0  9   23.0
1  0    NaN  3    1.0
2  3    NaN  5    NaN
3  3   50.0  2  268.0
4  7  234.0  4    NaN

如果您有很多列(数字;非数字),您可以通过仅在非数字列上应用 pd.to_numeric 来提高性能。

df.dtypes.eq(object)

A    False
B     True
C    False
D     True
dtype: bool

cols = df.columns[df.dtypes.eq(object)]
# Actually, `cols` can be any list of columns you need to convert.
cols
# Index(['B', 'D'], dtype='object')

df[cols] = df[cols].apply(pd.to_numeric, errors='coerce')
# Alternatively,
# for c in cols:
#     df[c] = pd.to_numeric(df[c], errors='coerce')

df

   A      B  C      D
0  5    1.0  9   23.0
1  0    NaN  3    1.0
2  3    NaN  5    NaN
3  3   50.0  2  268.0
4  7  234.0  4    NaN

沿列应用 pd.to_numeric(即 axis=0,默认值)对于长 DataFrame 应该稍微快一些。

关于python - 将 pandas.Series 从 dtype 对象转换为 float ,将错误转换为 nans,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25952790/

相关文章:

arrays - 提取数组中非 NaN 元素的索引和值的正确方法

c - 如何向结构添加多个值

python - 在 Python SWIG 中包装 void * 参数

python - 可以结合swig生成的数据类型和ctypes函数

python - 使用 Python 3.2 和 cx_Freeze 创建 Windows 可执行文件

python - 带 pandas 的表枢轴

python - zip 生成器从元组列表传递参数

python - Pandas 数据帧 : Concat and to_excel output

按滚动标准差分组的 Pandas

python - pandas dataframe将函数应用于具有nans的列