gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:30:41 25 4
gpt4 key购买 nike

考虑以下情况:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com