在python AttributeError中键入转换:' str'对象没有属性' astype'

时间:2017-01-29 03:37:03

标签: python pandas type-conversion

我对python pandas中的类型转换感到困惑

df = pd.DataFrame({'a':['1.23', '0.123']})
type(df['a'])
df['a'].astype(float)

这里df是一个pandas系列,它的内容是2个字符串,然后我可以在这个pandas系列上应用astype(float),并且它正确地将所有字符串转换为float。然而

df['a'][1].astype(float)

给了我AttributeError:' str'对象没有属性' astype'。我的问题是:怎么会这样?我可以将整个系列从字符串转换为浮点数,但我无法将此系列的条目从字符串转换为浮点数?

另外,我加载了我的原始数据集

df['id'].astype(int)

它生成了ValueError:对于带有基数为10的int()的无效文字:'' 这似乎表明我的df['id']中有空白。所以我通过输入

来检查是否属实
'' in df['id']
它说错了。所以我很困惑。

3 个答案:

答案 0 :(得分:5)

df['a']返回Seriesastype对象,该对象具有df['a'][1]作为矢量化方式,可将系列中的所有元素转换为另一个元素。

'0.123'返回数据帧的一个单元格的内容,在本例中为字符串str。现在返回一个没有此功能的type(df['a'][1]) Out[25]: str float(df['a'][1]) Out[26]: 0.123 type(float(df['a'][1])) Out[27]: float 对象。要转换它,请使用常规python指令:

in

根据您的第二个问题,最后调用__contains__的运算符''针对以help(pd.Series.__contains__) Help on function __contains__ in module pandas.core.generic: __contains__(self, key) True if the key is in the info axis 为参数的系列,这里是运算符的文档字符串:

in

这意味着df Out[54]: a 0 42 1 '' in df Out[55]: False df=='' Out[56]: a 0 False 1 True df[df['a']==''] Out[57]: a 1 运算符正在搜索索引中的空字符串,而不是它的内容。

搜索空字符串的方法是使用等号运算符:

{{1}}

答案 1 :(得分:2)

df['a'][1]将返回数组内的实际值,位于1位置,实际上是一个字符串。您可以使用float(df['a'][1])转换它。

>>> df = pd.DataFrame({'a':['1.23', '0.123']})
>>> type(df['a'])
<class 'pandas.core.series.Series'>
>>> df['a'].astype(float)
0    1.230
1    0.123
Name: a, dtype: float64
>>> type(df['a'][1])
<type 'str'>

对于第二个问题,也许您的原始数据有空值。正确的测试将是:

>>> df = pd.DataFrame({'a':['1', '']})
>>> '' in df['a'].values
True

第二个问题的来源:https://stackoverflow.com/a/21320011/5335508

答案 2 :(得分:0)

data1 = {'age': [1,1,2, np.nan],
        'gender': ['m', 'f', 'm', np.nan],
        'salary': [2,1,2, np.nan]}

x = pd.DataFrame(data1)
for i in list(x.columns):
    print(type((x[i].iloc[1])))
    if isinstance(x[i].iloc[1], str):
        print("It is String")
    else:
        print('Not a String')