如何将列转换为数字,同时保持在pandas中完整失败

时间:2018-02-13 15:39:08

标签: python pandas

我将我的文本文件读入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。谢谢你们。

2 个答案:

答案 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))