在Pandas中将浮点数转换为字符串

28

我有一个包含以下数据类型的数据框。

> df.dtypes
    Col1         float64
    Col2          object
    dtype: object

当我执行以下操作时:

df['Col3']  = df['Col2'].apply(lambda s: len(s) >= 2  and s[0].isalpha())

我明白了:

TypeError: object of type 'float' has no len()
我相信如果我将“对象”转换为“字符串”,就能实现我的目标。但是,当我执行以下操作时:

df['Col2'] = df['Col2'].astype(str)

Col2 的数据类型并未改变。我对 Pandas 中的 "object" 数据类型有些困惑。究竟什么是 "object"?

更多信息:以下是 Col2 的样子:

               Col2
1                F5
2               K3V
3                B9
4               F0V
5             G8III
6              M0V:
7                G0
8      M6e-M8.5e Tc
2个回答

37
如果一个列包含字符串或被视为字符串,它将具有 `dtype` 为 `object` 的类型(但不一定是真正的倒退 - 更多内容请参见下文)。这里是一个简单的例子:
import pandas as pd
df = pd.DataFrame({'SpT': ['string1', 'string2', 'string3'],
                   'num': ['0.1', '0.2', '0.3'],
                   'strange': ['0.1', '0.2', 0.3]})
print df.dtypes
#SpT        object
#num        object
#strange    object
#dtype: object
如果一个列中只包含字符串,我们可以像你所做的那样在它上面应用 len,应该可以正常工作:
print df['num'].apply(lambda x: len(x))
#0    3
#1    3
#2    3

然而,dtype为对象并不意味着它只包含字符串。例如,列strange包含了混合类型的对象--一些是str,一些是float。应用函数len将会引发与您所见过类似的错误:

print df['strange'].apply(lambda x: len(x))
# TypeError: object of type 'float' has no len()

因此,问题可能是您没有将列正确转换为字符串,该列仍然包含混合对象类型。

继续上面的示例,让我们将 strange 转换为字符串,并检查是否可以使用 apply

df['strange'] = df['strange'].astype(str)
print df['strange'].apply(lambda x: len(x))
#0    3
#1    3
#2    3

(在您的问题中,df_cleaneddf_clean存在可疑的差异,这是打字错误还是代码错误导致的问题?)


1
"隐藏"的空值

如果列的数据类型是object,经常会出现TypeError: object of type 'float' has no len()的错误,这通常是因为该列包含NaN值。通过调用以下方法来检查是否属于这种情况:

df['Col2'].isna().any()

如果返回值为True,那么就有NaN,你可能需要处理它。
矢量化的 str. 方法

如果不重要的话,可以调用矢量化的 str.len()str.isdigit() 等方法。例如,OP 中的代码可以写成:

df['Col3'] = df['Col2'].str.len().ge(2) & df['Col2'].str[0].str.isalpha()

为了获得所需的输出而避免错误。


'string' dtype

自从pandas 1.0版本以来,有一个新的'string'数据类型,可以在将列转换为'string'数据类型后保留可空整数数据类型。例如,如果您想将浮点数转换为没有小数的字符串,但是该列包含您想要保留为空的NaN值,则可以使用'string'数据类型。

df = pd.DataFrame({
    'Col1': [1.2, 3.4, 5.5, float('nan')]
})

df['Col1'] = df['Col1'].astype('string').str.split('.').str[0]

返回

0       1
1       3
2       5
3    <NA>
Name: Col1, dtype: object

其中<NA>是一个可空整数,您可以使用dropna()删除它,而df['Col1'].astype(str)将NaN转换为字符串。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接