13

我有一个带有“cap”列的熊猫数据框。该列主要由浮点数组成,但其中包含一些字符串,例如在索引 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

4 回答 4

21

使用 float64 dtype 列(而不是对象)的计算效率更高,所以这通常是首选......它还允许您进行其他计算。因此,建议对缺失数据使用 NaN(而不是您自己的占位符或 None)。

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

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

或者通过将“na”附加到被视为 NaN 的值列表中,直接将其作为 csv 读取:

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

正如杰夫建议的那样:

快速重复 3 次:object==bad,float==good

于 2013-11-08T18:40:05.623 回答
2

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

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

你可以直接做:

df = pd.read_csv(myfile.file)

然后转换为浮点数,并将任何不是数字的内容作为 NaN:

df = pd.to_numeric(df, errors='coerce')
于 2018-01-30T04:48:00.527 回答
1

这是一个可能的解决方法

首先,您定义一个函数,仅在需要时将数字转换为浮点数

 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
于 2013-11-08T16:51:51.700 回答
1

我在上面尝试了一个替代方案:

for num, item in enumerate(data['col']):
    try:
        float(item)
    except:
        data['col'][num] = nan
于 2014-05-04T10:03:08.663 回答