python:将pandas dataframe中的数值数据转换为存在字符串时的浮点数

时间:2013-11-08 16:31:58

标签: python pandas dataframe

我有一个带有'cap'列的pandas数据框。此列主要由浮点数组成,但其中包含一些字符串,例如索引2。

df =
    cap
0    5.2
1    na
2    2.2
3    7.6
4    7.5
5    3.0
...

我从csv文件中导入数据,如下所示:

df = DataFrame(pd.read_csv(myfile.file))

不幸的是,当我这样做时,列'cap'完全作为字符串导入。我希望浮动被识别为浮点数和字符串作为字符串。尝试使用以下方法进行转换:

df['cap'] = df['cap'].astype(float)

引发错误:

could not convert string to float: na

有没有办法让所有数字成为浮点数但是将'na'保持为字符串?

4 个答案:

答案 0 :(得分:19)

使用float64 dtype(而不是object)列进行计算效率更高,因此通常首选...它还允许您进行其他计算。因为这是recommended to use NaN for missing data(而不是您自己的占位符,或无)。

这真的是你想要的答案吗?

In [11]: df.sum()  # all strings
Out[11]: 
cap    5.2na2.27.67.53.0
dtype: object

In [12]: df.apply(lambda f: to_number(f[0]), axis=1).sum()  # floats and 'na' strings
TypeError: unsupported operand type(s) for +: 'float' and 'str'

您应该使用convert_numeric来强制浮动:

In [21]: df.convert_objects(convert_numeric=True)
Out[21]: 
   cap
0  5.2
1  NaN
2  2.2
3  7.6
4  7.5
5  3.0

或者直接将其作为csv阅读,方法是将“na”附加到要被视为NaN的值列表中:

In [22]: pd.read_csv(myfile.file, na_values=['na'])
Out[22]: 
   cap
0  5.2
1  NaN
2  2.2
3  7.6
4  7.5
5  3.0

在任何一种情况下,sum(以及许多其他pandas函数)现在都可以工作:

In [23]: df.sum()
Out[23]:
cap    25.5
dtype: float64

作为Jeff advises

  

快速重复3次:对象==坏,浮动==好

答案 1 :(得分:2)

首先,您导入CSV的方式是多余的,而不是:

df = DataFrame(pd.read_csv(myfile.file))

你可以直接做:

df = pd.read_csv(myfile.file)

然后转换为float,并将任何不是数字的数字设为NaN:

df = pd.to_numeric(df, errors='coerce')

答案 2 :(得分:1)

这是一种可行的解决方法

首先定义一个函数,只在需要时将数字转换为float

 def to_number(s):
    try:
        s1 = float(s)
        return s1
    except ValueError:
        return s

然后逐行应用它。


示例:

给定的

 df 
     0
  0  a
  1  2

a2都是字符串,我们通过

进行转换
converted = df.apply(lambda f : to_number(f[0]) , axis = 1)  

 converted
 0    a
 1    2

直接检查类型:

type(converted.iloc[0])                                                                                                                             
str

type(converted.iloc[1])                                                                                                                             
float

答案 3 :(得分:1)

我在上面尝试了另一种选择:

for num, item in enumerate(data['col']):
    try:
        float(item)
    except:
        data['col'][num] = nan