将字符串转换为DataFrame中的float


112

如何隐藏包含NaN浮点数的字符串和值的DataFrame列。还有另一列的值为字符串和浮点数;如何将整个列转换为浮点数。


7
请勿使用convert_objects。不推荐使用。使用to_numericastype代替
泰德·彼得鲁

Answers:


72

注意: pd.convert_objects现在已弃用。您应该使用pd.Series.astype(float)pd.to_numeric其他答案中所述。

在0.11中可用。强制转换(或将其设置为nan),即使astype失败也会起作用。它也按系列进行排序,因此不会转换为完整的字符串列

In [10]: df = DataFrame(dict(A = Series(['1.0','1']), B = Series(['1.0','foo'])))

In [11]: df
Out[11]: 
     A    B
0  1.0  1.0
1    1  foo

In [12]: df.dtypes
Out[12]: 
A    object
B    object
dtype: object

In [13]: df.convert_objects(convert_numeric=True)
Out[13]: 
   A   B
0  1   1
1  1 NaN

In [14]: df.convert_objects(convert_numeric=True).dtypes
Out[14]: 
A    float64
B    float64
dtype: object

请注意,这不适用于列(在Leadt multiindex下),仅适用于数据
框中的

1
我不得不使用set_levels将字符串转换为float
denfromufa 2015年

16
df['ColumnName'] = df['ColumnName'].convert_objects(convert_numeric=True)您只能转换一个列。
杰克

19
现在是较新版本中的pd.to_numeric(col)
Jeff

11
在较新的熊猫中,不建议使用convert_objects。使用特定于数据类型的转换器pd.to_numeric。
Thomas Matthew

57

你可以试试看df.column_name = df.column_name.astype(float)。至于这些NaN值,您需要指定如何转换它们,但是您可以使用该.fillna方法来进行转换。

例:

In [12]: df
Out[12]: 
     a    b
0  0.1  0.2
1  NaN  0.3
2  0.4  0.5

In [13]: df.a.values
Out[13]: array(['0.1', nan, '0.4'], dtype=object)

In [14]: df.a = df.a.astype(float).fillna(0.0)

In [15]: df
Out[15]: 
     a    b
0  0.1  0.2
1  0.0  0.3
2  0.4  0.5

In [16]: df.a.values
Out[16]: array([ 0.1,  0. ,  0.4])

47

在较新版本的熊猫(0.17及更高版本)中,可以使用to_numeric函数。它允许您转换整个数据框或仅转换单个列。它还使您能够选择如何处理无法转换为数值的内容:

import pandas as pd
s = pd.Series(['1.0', '2', -3])
pd.to_numeric(s)
s = pd.Series(['apple', '1.0', '2', -3])
pd.to_numeric(s, errors='ignore')
pd.to_numeric(s, errors='coerce')

32
要申请pd.to_numericDataFrame,可以使用df.apply(pd.to_numeric)在这个答案详细解释
Ninjakannon

31
df['MyColumnName'] = df['MyColumnName'].astype('float64') 

6
从String转换为Float时,这不起作用:ValueError: could not convert string to float: 'date'
Jack

@Jack您知道这里的解决方法吗?我遇到了将字符串转换为float的确切问题。
哈特(Hatt)

@Hatt我面临着同样的问题。您找到解决方案了吗?
Prakhar Jhudele

@Jack我不确定,但是您似乎混淆了日期格式和浮点数。#转换为datetime df ['date'] = pd.to_datetime(df ['date'])
Claude COULOMBE

8

您必须先将np.nan替换为空字符串(''),然后再转换为float。即:

df['a']=df.a.replace('',np.nan).astype(float)

1

这是一个例子

                            GHI             Temp  Power Day_Type
2016-03-15 06:00:00 -7.99999952505459e-7    18.3    0   NaN
2016-03-15 06:01:00 -7.99999952505459e-7    18.2    0   NaN
2016-03-15 06:02:00 -7.99999952505459e-7    18.3    0   NaN
2016-03-15 06:03:00 -7.99999952505459e-7    18.3    0   NaN
2016-03-15 06:04:00 -7.99999952505459e-7    18.3    0   NaN

但是如果这都是字符串值...就像我这样...将所需的列转换为浮点数:

df_inv_29['GHI'] = df_inv_29.GHI.astype(float)
df_inv_29['Temp'] = df_inv_29.Temp.astype(float)
df_inv_29['Power'] = df_inv_29.Power.astype(float)

您的数据框现在将具有浮点值:-)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.