从v0.24+开始,pandas引入了可空整数类型,允许整数与NaN共存。如果你的列中有整数,你可以使用
pd.__version__
pd.to_numeric(s, errors='coerce').astype('Int32')
0 1
1 2
2 3
3 4
4 NaN
dtype: Int32
扩展 DataFrames
的方法
如果您需要将此方法扩展到 DataFrames
,您需要对每行进行 应用。您可以使用 DataFrame.apply
来实现。
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
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)]
cols
df[cols] = df[cols].apply(pd.to_numeric, 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
在列(即默认的axis=0
)上应用pd.to_numeric
,对于较长的数据框来说速度应该会稍微快一些。
s.str.isalnum()
:-) 结合mask
。 - BENYs.str.isdigit()
吗?它只适用于整数,不适用于浮点数。不过这个想法很好。 - cs95to_numeric
很重要。 - Bharath M Shetty