我对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']
它说错了。所以我很困惑。
答案 0 :(得分:5)
df['a']
返回Series
个astype
对象,该对象具有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
答案 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')