【问题标题】:Converting strings to floats in a DataFrame将字符串转换为 DataFrame 中的浮点数
【发布时间】:2013-05-19 17:32:51
【问题描述】:

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

【问题讨论】:

  • 请勿使用 convert_objects。它已被弃用。请改用to_numericastype

标签: python pandas


【解决方案1】:

你可以试试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])

【讨论】:

    【解决方案2】:

    注意: 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
    

    【讨论】:

    • 请注意,这不适用于列(在前导多索引处),仅适用于数据框中的值
    • 我不得不使用 set_levels 将字符串转换为浮点数
    • df['ColumnName'] = df['ColumnName'].convert_objects(convert_numeric=True) 您只能转换一列。
    • 现在是新版本中的 pd.to_numeric(col)
    • convert_objects 在较新的 pandas 中已弃用。使用特定于数据类型的转换器 pd.to_numeric。
    【解决方案3】:
    df['MyColumnName'] = df['MyColumnName'].astype('float64') 
    

    【讨论】:

    • 这在从字符串转换为浮点数时不起作用:ValueError: could not convert string to float: 'date'
    • @Jack 你知道这里的解决方法吗?我遇到了将字符串转换为浮点数的确切问题。
    • @Hatt 我面临同样的问题。你找到解决办法了吗?
    • @Jack 我不确定,但您似乎混淆了日期格式和浮点数。 # 转换为日期时间 df['date'] = pd.to_datetime(df['date'])
    【解决方案4】:

    在更新版本的 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')
    

    【讨论】:

    【解决方案5】:

    这是一个例子

                                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)
    

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

    【讨论】:

      【解决方案6】:

      在转换为浮点数之前,您必须用 np.nan 替换空字符串 ('')。即:

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

      【讨论】:

        猜你喜欢
        • 2011-11-25
        • 1970-01-01
        • 1970-01-01
        • 2021-07-22
        • 1970-01-01
        • 2020-04-21
        相关资源
        最近更新 更多