我想通过 iloc 更改我的 DataFrame 中某些列的数据类型。但是当我尝试这个时,dtype 没有改变(它仍然是对象):
import pandas as pd
names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'class']
df = pd.read_csv('iris.csv', names=names, header=None)
df = df[1:]
In [11]: df.head()
Out[11]:
sepal-length sepal-width petal-length petal-width class
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
In [12]: df.iloc[:,:-1] = df.iloc[:,:-1].astype(float)
# No Error
In [13]: df.dtypes # still object dtype
Out[13]:
sepal-length object
sepal-width object
petal-length object
petal-width object
class object
dtype: object
注意:不用iloc我也能做到,但是太长了:
df[['sepal-length', 'sepal-width', 'petal-length', 'petal-width']] = df[['sepal-length', 'sepal-width', 'petal-length', 'petal-width']].astype(float)
请您参考如下方法:
您可以使用 infer_objects :
In [11]: df.infer_objects()
Out[11]:
sepal-length sepal-width petal-length petal-width class
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
In [12]: df.infer_objects().dtypes
Out[12]:
sepal-length float64
sepal-width float64
petal-length float64
petal-width float64
class object
dtype: object
问题是虽然右侧是正确的:
In [21]: df.iloc[:,:-1].astype(float).dtypes
Out[21]:
sepal-length float64
sepal-width float64
petal-length float64
petal-width float64
dtype: object
分配 df.iloc[:,:-1] = 正在更新现有列并且不更改它们的 dtype。
