在Pandas中将Float转换为String

Roh*_*hit 13 python pandas

我对Pandas中的数据类型"object"感到困惑.究竟什么是"对象"?

我想将变量"SpT"(见下文)从object更改为String.

> df_cleaned.dtypes
    Vmag        float64
    RA          float64
    DE          float64
    Plx         float64
    pmRA        float64
    pmDE        float64
    B-V         float64
    SpT          object
    M_V         float64
    distance    float64
    dtype: object
Run Code Online (Sandbox Code Playgroud)

为此我做了以下事情:

df_cleaned['SpT'] = df_cleaned['SpT'].astype(str)
Run Code Online (Sandbox Code Playgroud)

但这对SpT的类型没有影响.

这样做的原因是当我执行以下操作时:

f = lambda s: (len(s) >= 2)  and (s[0].isalpha()) and (s[1].isdigit())
i  = df_cleaned['SpT'].apply(f)
df_cleaned = df_cleaned[i]
Run Code Online (Sandbox Code Playgroud)

我明白了:

TypeError: object of type 'float' has no len()
Run Code Online (Sandbox Code Playgroud)

因此,我相信如果我将"对象"转换为"字符串",我会做我想做的事情.

更多信息:这就是SpT的样子:

HIP
1                F5
2               K3V
3                B9
4               F0V
5             G8III
6              M0V:
7                G0
8      M6e-M8.5e Tc
9                G5
10              F6V
11               A2
12            K4III
13            K0III
14               K0
15               K2
...
118307    M2III:
118308        K:
118309        A2
118310        K5
118312        G5
118313        F0
118314        K0
118315     K0III
118316        F2
118317        F8
118318        K2
118319       G2V
118320        K0
118321       G5V
118322      B9IV
Name: SpT, Length: 114472, dtype: object
Run Code Online (Sandbox Code Playgroud)

YS-*_*S-L 21

如果列中包含字符串或被视为字符串,就会产生dtypeobject(但不一定是真的落后-详见下文).这是一个简单的例子:

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
Run Code Online (Sandbox Code Playgroud)

如果一个列只包含字符串,我们就可以len像你所做的那样应用它应该正常工作:

print df['num'].apply(lambda x: len(x))
#0    3
#1    3
#2    3
Run Code Online (Sandbox Code Playgroud)

但是,dtype对象的一个并不意味着它只包含字符串.例如,该列strange包含具有混合类型的对象 - 以及一些str和一个float.应用该函数len将引发类似于您所看到的错误:

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

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

继续上面的例子,让我们转换strange为字符串并检查是否apply有效:

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

(之间有一个可疑的差异df_cleaneddf_clean没有在你的问题,它是一个错字或导致该问题的代码错了吗?)

  • 顺便提一下,这里的一个潜在问题是空处理.它看起来像'astype('str')`将numpy.nan转换为'n',而`str(numpy.nan)`产生'nan'. (4认同)