Python 熊猫何时输出系列与数据帧?

Python 熊猫何时输出系列与数据帧?,python,pandas,dataframe,Python,Pandas,Dataframe,我正在做熊猫教程。它有关于castdataframe的练习,示例如下 有两个几乎相似的命令,除了一个小差异,一个输出一个序列,另一个输出一个数据帧。我不明白为什么 第一个代码是: c1 = cast[cast.title == 'The Pink Panther'] c2 = c1.groupby('year')['n'].max() type(c2) 它使c2成为一个系列。但是,如果我像下面的代码那样简单地在“n”周围添加另一个方括号,我会得到一个数据帧 c1 = cast[cast.ti

我正在做熊猫教程。它有关于
cast
dataframe的练习,示例如下

有两个几乎相似的命令,除了一个小差异,一个输出一个序列,另一个输出一个数据帧。我不明白为什么

第一个代码是:

c1 = cast[cast.title == 'The Pink Panther']
c2 = c1.groupby('year')['n'].max()
type(c2)
它使c2成为一个系列。但是,如果我像下面的代码那样简单地在“n”周围添加另一个方括号,我会得到一个数据帧

c1 = cast[cast.title == 'The Pink Panther']
c2 = c1.groupby('year')[['n']].max()
type(c2)

有人能帮我解释一下吗?谢谢

如果传递列列表,则会得到一个数据帧。列表中有多少元素并不重要。如果只是在一个项目列表的情况下返回一个序列,这将是令人困惑的,因为有时候您的列表可能是通过编程生成的。例如,假设您有:

columns_to_use = [column for blah in blahblah]
x = c1.groupby('year')[columns_to_use]

对于当前的行为,您知道
x
将始终是一个数据帧,因为
columns\u to\u use
是一个列表。如果不是这样的话,您以后可能会出错,因为您无法提前知道
x
是一个系列还是一个数据帧,因此您无法知道,例如,您可以在以后的代码中调用它的方法。

基本上,如果您在数据帧a
系列
上传递
getitem\uuuuuuuuu
np.ndarray
索引
,或
列表
,然后您将返回一个数组(
数据帧

否则,
\uuu getitem\uuu
将尝试检索a列(
系列
)。此案例包括StringType、数字、自定义类等

DataFrameGroupBy
的行为类似于
DataFrame
,因为如果您传递前面列出的任何对象(显然还有元组),您将返回一个二维对象(DataFrame),否则它将尝试检索一维对象(系列)

在第一个代码块中,您将传递一个字符串:

>>> type(c1['year'])
pandas.core.frame.Series
在第二个代码块中,您将包含字符串的列表传递给
\uuu getitem\uuu

>>> type(c1[['year']])
pandas.core.frame.DataFrame
在这种情况下,
[]
有多种含义

传递一个元素的列表通常不是很有用,但是除了在顶部很好地打印列名(但是序列仍然保留
name
属性中的列名)。将列表传递给
\uuu getitem\uuu
的主要目的是在多个列上键入

要查看方括号
[]
如何在类上工作,请检查其
\uuu getitem\uuu
方法

pandas.series.core.frame.DataFrame

    if isinstance(key, (Series, np.ndarray, Index, list)):
        # either boolean or fancy integer index
        return self._getitem_array(key)
    elif isinstance(key, DataFrame):
        return self._getitem_frame(key)
    elif is_mi_columns:
        return self._getitem_multilevel(key)
    else:
        return self._getitem_column(key)