【发布时间】:2013-05-19 17:32:51
【问题描述】:
如何将包含字符串和 NaN 值的 DataFrame 列转换为浮点数。还有另一列,其值为字符串和浮点数;如何将整列转换为浮点数。
【问题讨论】:
-
请勿使用
convert_objects。它已被弃用。请改用to_numeric或astype
如何将包含字符串和 NaN 值的 DataFrame 列转换为浮点数。还有另一列,其值为字符串和浮点数;如何将整列转换为浮点数。
【问题讨论】:
convert_objects。它已被弃用。请改用to_numeric 或astype
你可以试试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])
【讨论】:
注意:
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
【讨论】:
df['ColumnName'] = df['ColumnName'].convert_objects(convert_numeric=True) 您只能转换一列。
df['MyColumnName'] = df['MyColumnName'].astype('float64')
【讨论】:
ValueError: could not convert string to float: 'date'
在更新版本的 pandas(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')
【讨论】:
pd.to_numeric 应用于DataFrame,可以将df.apply(pd.to_numeric) 用作explained in detail in this answer。
这是一个例子
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)
您的数据框现在将具有浮点值 :-)
【讨论】:
在转换为浮点数之前,您必须用 np.nan 替换空字符串 ('')。即:
df['a']=df.a.replace('',np.nan).astype(float)
【讨论】: