如何将数据类型:object转换为python中的float64?

时间:2015-02-02 11:50:14

标签: python pandas

我四处走动,尝试了很多不同的方式,所以我猜我的核心理解是错误的。我将非常感谢您帮助理解我的编码/解码问题。

我从SQL导入数据框,似乎有些数据类型:float64被转换为Object。因此,我无法做任何计算。我无法将Object转换回float64。

df.head()

Date        WD  Manpower 2nd     CTR    2ndU    T1    T2      T3      T4 

2013/4/6    6   NaN     2,645   5.27%   0.29    407     533     454     368
2013/4/7    7   NaN     2,118   5.89%   0.31    257     659     583     369
2013/4/13   6   NaN     2,470   5.38%   0.29    354     531     473   383
2013/4/14   7   NaN     2,033   6.77%   0.37    396     748     681     458
2013/4/20   6   NaN     2,690   5.38%   0.29    361     528     541     381

df.dtypes

WD             float64
Manpower       float64
2nd             object
CTR             object
2ndU           float64
T1              object
T2              object
T3              object
T4              object
T5              object

dtype: object

SQL表:

enter image description here

6 个答案:

答案 0 :(得分:19)

您只需拨打convert_objects

即可转换大部分列
In [36]:

df = df.convert_objects(convert_numeric=True)
df.dtypes
Out[36]:
Date         object
WD            int64
Manpower    float64
2nd          object
CTR          object
2ndU        float64
T1            int64
T2          int64
T3           int64
T4        float64
dtype: object

对于第二列和“点击率”列,我们可以调用向量化str方法来替换千位分隔符并删除'%'符号,然后astype进行转换:

In [39]:

df['2nd'] = df['2nd'].str.replace(',','').astype(int)
df['CTR'] = df['CTR'].str.replace('%','').astype(np.float64)
df.dtypes
Out[39]:
Date         object
WD            int64
Manpower    float64
2nd           int32
CTR         float64
2ndU        float64
T1            int64
T2            int64
T3            int64
T4           object
dtype: object
In [40]:

df.head()
Out[40]:
        Date  WD  Manpower   2nd   CTR  2ndU   T1    T2   T3     T4
0   2013/4/6   6       NaN  2645  5.27  0.29  407   533  454    368
1   2013/4/7   7       NaN  2118  5.89  0.31  257   659  583    369
2  2013/4/13   6       NaN  2470  5.38  0.29  354   531  473    383
3  2013/4/14   7       NaN  2033  6.77  0.37  396   748  681    458
4  2013/4/20   6       NaN  2690  5.38  0.29  361   528  541    381

或者您可以在不调用astype的情况下执行上述字符串处理操作,然后调用convert_objects一次性转换所有内容。

<强>更新

由于版本0.17.0 convert_objects已弃用且没有顶级功能,因此您需要这样做:

df.apply(lambda col:pd.to_numeric(col, errors='coerce'))

请参阅docs及此相关问题:pandas: to_numeric for multiple columns

答案 1 :(得分:4)

我在从具有多个内部标题行的Excel工作表创建的DataFrame(df)中遇到此问题。

清除df的内部标题行后,列&#39;值是&#34;非空对象&#34;输入(DataFrame.info())。

此代码将多列的所有数值转换为int64和float64:

for i in range(0, len(df.columns)):
    df.iloc[:,i] = pd.to_numeric(df.iloc[:,i], errors='ignore')
    # errors='ignore' lets strings remain as 'non-null objects'

答案 2 :(得分:3)

不推荐使用convert_objects。

对于pandas&gt; = 0.17.0,请使用pd.to_numeric

df["2nd"] = pd.to_numeric(df["2nd"])

答案 3 :(得分:0)

你可以试试这个:

df['2nd'] = pd.to_numeric(df['2nd'].str.replace(',', ''))
df['CTR'] = pd.to_numeric(df['CTR'].str.replace('%', ''))

答案 4 :(得分:0)

或者您可以使用正则表达式来处理多个项目,作为此问题的一般情况,

df['2nd'] = pd.to_numeric(df['2nd'].str.replace(r'[,.%]','')) 
df['CTR'] = pd.to_numeric(df['CTR'].str.replace(r'[^\d%]',''))

答案 5 :(得分:0)

X = np.array(X, dtype=float)

您可以使用它在python 3.7.6中转换为float数组