我有一个带有'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'保持为字符串?
答案 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
a
和2
都是字符串,我们通过
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