为什么pandas DataFrame.iloc返回类别dtype的标量,但是返回对象dtype的标量?

时间:2018-08-23 22:51:12

标签: python-3.x pandas

在pandas 0.23.0和python 3.6.5中,我看到在DataFrame上使用arg时无法理解的行为。

如果DataFrame仅具有一列,并且该列的类型为'category',则iloc[int]返回标量值,而不是Series。

当“答案”列是对象dtype时,我将按预期得到iloc[int]

Series

但是,当我将列更改为类别dtype时,我突然得到>>> df = pandas.DataFrame({'answer': ['no', 'no', 'yes']}) >>> df['answer'] = df['answer'].astype('object') >>> df.iloc[0] answer no Name: 0, dtype: object >>> type(df.iloc[0]) <class 'pandas.core.series.Series'> ??

str

请注意,即使一个数据框包含多个列,我也不再从其获取标量值,即使它们都是类别:

>>> df = pandas.DataFrame({'answer': ['no', 'no', 'yes']})
>>> df['answer'] = df['answer'].astype('category')
>>> df.iloc[0]
'no'
>>> type(df.iloc[0])
<class 'str'>

这是预期的行为吗?如果是这样,无论列类型如何,如何强制>>> df = pandas.DataFrame({'answer': ['no', 'no', 'yes'], 'name': ['steve', 'john', 'sally']}) >>> df['answer'] = df['answer'].astype('category') >>> df['name'] = df['name'].astype('category') >>> df.iloc[0] answer no name steve Name: 0, dtype: object >>> type(df.iloc[0]) <class 'pandas.core.series.Series'> 返回iloc[int]

1 个答案:

答案 0 :(得分:1)

在仔细阅读了文档之后,看起来这种行为是预期的:

  

从分类数据中返回单个项目也将返回该值,而不是长度为“ 1”的分类。

     

要获取类型为类别的单个值系列,请传入具有单个值的列表

所以最终通过iloc[[0], 0]起作用了:

>>> pandas.DataFrame({'answer': ['no', 'no', 'yes']}, dtype='category').iloc[[0], 0]
0    no
Name: answer, dtype: category
Categories (2, object): [no, yes]
>>> type(pandas.DataFrame({'answer': ['no', 'no', 'yes']}, dtype='category').iloc[[0], 0])
<class 'pandas.core.series.Series'>

对我来说很奇怪,但至少有记载。

https://pandas.pydata.org/pandas-docs/stable/categorical.html#getting