pd.to_numeric](http://pandas.pydata.org/pandas-
docs/stable/generated/pandas.to_numeric.html)与
errors='coerce'
# Setups = pd.Series(['1', '2', '3', '4', '.'])s0 11 22 33 44 .dtype: objectpd.to_numeric(s, errors='coerce')0 1.01 2.02 3.03 4.04 NaNdtype: float64
如果需要
NaN填写,请使用
Series.fillna。
pd.to_numeric(s, errors='coerce').fillna(0, downcast='infer')0 11 22 33 44 0dtype: float64
注意,
downcast='infer'在可能的情况下,将尝试将浮点型转换为整数。如果不需要,请删除该参数。
从v0.24 +起,pandas引入了Nullable Integer类型,该类型允许整数与NaN共存。如果列中有整数,则可以使用
pd.__version__# '0.24.1'pd.to_numeric(s, errors='coerce').astype('Int32')0 11 22 33 44 NaNdtype: Int32还有其他选项可供选择,请阅读文档以获取更多信息。
扩展为
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 D0 5 1 9 231 0 ### 3 12 3 ... 5 ...3 3 50 2 2684 7 234 4 $$df.dtypesA int64B objectC int64D objectdtype: objectdf2 = df.apply(pd.to_numeric, errors='coerce')df2 A B C D0 5 1.0 9 23.01 0 NaN 3 1.02 3 NaN 5 NaN3 3 50.0 2 268.04 7 234.0 4 NaNdf2.dtypesA int64B float64C int64D float64dtype: object
您也可以使用
Dataframe.transform;
尽管我的测试表明这稍微慢一些:
df.transform(pd.to_numeric, errors='coerce') A B C D0 5 1.0 9 23.01 0 NaN 3 1.02 3 NaN 5 NaN3 3 50.0 2 268.04 7 234.0 4 NaN
如果您有许多列(数字;非数字),则可以通过
pd.to_numeric仅对非数字列应用来提高性能。
df.dtypes.eq(object)A FalseB TrueC FalseD Truedtype: boolcols = 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 D0 5 1.0 9 23.01 0 NaN 3 1.02 3 NaN 5 NaN3 3 50.0 2 268.04 7 234.0 4 NaN
对于较长的Dataframe
pd.to_numeric,沿列应用(即,
axis=0默认值)应稍快一些。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)