仅将数据框中的特定列转换为数值

时间:2019-07-16 20:06:19

标签: pandas dataframe apply number-formatting numeric

我目前有一个数据帧,其中包含n个数量值列和三列日期时间和字符串值。我想将所有列(但三列)都转换为数值,但是不确定最好的方法是什么。下面是一个示例数据框(简化):

df2 = pd.DataFrame(np.array([[1, '5-4-2016', 10], [1,'5-5-2016', 5],[2, '5- 
4-2016', 10], [2, '5-5-2016', 7], [5, '5-4-2016', 8]]), columns= ['ID', 
'Date', 'Number'])

我尝试使用类似(如下)的方法,但未成功。

exclude = ['Date']
df = df.drop(exclude, 1).apply(pd.to_numeric, 
errors='coerce').combine_first(df)

预期输出:(本质上,“ ID”和“ Number”字段的数据类型更改为float,而“ Date”保持不变)

        ID     Date         Number 
 0      1.0    5-4-2016       10.0  
 1      1.0    5-5-2016       5.0   
 2      2.0    5-4-2016       10.0 
 3      2.0    5-5-2016       7.0
 4      5.0    5-4-2016       8.0

2 个答案:

答案 0 :(得分:1)

您是否尝试过Series.astype()?

df['ID'] = df['ID'].astype(float)
df['Number'] = df['Number'].astype(float)

或日期以外的所有列:

for col in [x for x in df.columns if x != 'Date']:
   df[col] = df[col].astype(float)

df[[x for x in df.columns if x != 'Date']].transform(lambda x: x.astype(float), axis=1)

答案 1 :(得分:0)

如果您希望将其更改为浮动,则需要使用选项to_numeric来调用downcast='float'。否则,它将为int。您还需要重新连接到原始df2

的未转换列
df2[exclude].join(df2.drop(exclude, 1).apply(pd.to_numeric, downcast='float', errors='coerce'))

Out[1815]:
       Date   ID  Number
0  5-4-2016  1.0    10.0
1  5-5-2016  1.0     5.0
2  5-4-2016  2.0    10.0
3  5-5-2016  2.0     7.0
4  5-4-2016  5.0     8.0