我将我的文本文件读入pandas dataframe。所有列都是对象数据类型。我需要做的是转换所有出现的数字'数字'到数字列。 如果有几列,那很容易。但我真正的数据框有超过200列。我想知道是否还有将这些列转换为数字,同时保留那些无法完整转换的列。 例如,我有下面的数据框。
df = pd.DataFrame({'a': ['1', '2', 'NA', '4'],
'b': ['a', 'b', 'c', 'd'],
'c': ['aa', 'bb', 'cc', 'dd'],
'd': ['11', '22', '33', '44']})
df[['a', 'b', 'c', 'd']] = df[['a', 'b', 'c', 'd']].astype(int)
我收到了错误。如何将列a和d转换为数字,同时将b和c保持为对象?同样,我的真实数据框有很多列,这只是一个例子来说明我的观点。我不想做所有的硬编码来为每个列转换dtype。谢谢你们。
答案 0 :(得分:2)
OP1。我通常使用to_numeric
然后fillna
(原因:我通常在一列中有一些混合dtype)
df=df[['a', 'b', 'c', 'd']].apply(pd.to_numeric,errors='coerce').fillna(df)
df.dtypes
Out[605]:
a int64
b object
c object
d int64
dtype: object
Op2中。或者您可以使用to_numeric
+ ignore
df[['a', 'b', 'c', 'd']].apply(pd.to_numeric,errors='ignore').dtypes
Out[608]:
a int64
b object
c object
d int64
dtype: object
更新
df[['a', 'b', 'c', 'd']].apply(pd.to_numeric,errors='coerce').fillna(df).applymap(type)
Out[652]:
a b c d
0 <class 'float'> <class 'str'> <class 'str'> <class 'int'>
1 <class 'float'> <class 'str'> <class 'str'> <class 'int'>
2 <class 'str'> <class 'str'> <class 'str'> <class 'int'>
3 <class 'float'> <class 'str'> <class 'str'> <class 'int'>
如果需要,可以在运行第一个
之前添加df = df.replace('NA',np.nan)
更新2
s=df.apply(pd.to_numeric,errors='coerce').dropna(axis=1,thresh=1)
pd.concat([s,df.loc[:,~df.columns.isin(s.columns)]],1).dtypes
Out[668]:
a float64
d int64
b object
c object
dtype: object
答案 1 :(得分:0)
df[['a','d']]=df[['a','d']].apply(lambda x: x.astype(int))