Pandas何时输出Series而非DataFrame?

3
我正在学习pandas教程,网址是https://github.com/brandon-rhodes/pycon-pandas-tutorial/blob/master/Exercises-3.ipynb。其中有关于“cast”数据框的练习,以下是一个示例:

enter image description here

有两个命令几乎相同,除了一个小差别,一个输出Series,另一个输出dataframe。我不明白为什么。

第一个代码如下:

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

如果我在'n'周围添加另一个方括号,如以下代码所示,则会得到一个数据帧,并且它使c2成为一个系列。

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

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

2个回答

1
如果您传递列的列表,您将得到一个DataFrame。列表中有多少个元素并不重要。如果仅有一个元素,返回Series会让人感到困惑,因为有时您的列表可能是通过编程生成的。例如,假设您有以下内容:
columns_to_use = [column for blah in blahblah]
x = c1.groupby('year')[columns_to_use]

当前的行为表明,x将始终是一个DataFrame,因为columns_to_use是一个列表。如果不是这种情况,您可能会在以后的代码中遇到错误,因为您事先不知道x是Series还是DataFrame,因此您不知道可以在其上调用什么方法。请注意保留html标签。

0

基本上,如果你在DataFrame上传递__getitem__一个Seriesnp.ndarrayIndexlist,那么你将得到一个数组(DataFrame)。

否则,__getitem__将尝试检索列(Series)。这种情况包括字符串类型、数字、自定义类等。

DataFrameGroupBy的行为与DataFrame类似,如果你传递任何前面列出的对象(还有元组),你将得到一个二维对象(DataFrame),否则它将尝试检索一个一维对象(Series)。

在你的第一个代码块中,你传递了一个字符串:

>>> type(c1['year'])
pandas.core.frame.Series

在第二个代码块中,你将一个包含字符串的列表传递给__getitem__函数。
>>> type(c1[['year']])
pandas.core.frame.DataFrame

[]在这种情况下有多重含义。

通常情况下,传递一个只有一个元素的列表并不是很有用,除非在顶部漂亮地打印列名(但Series仍然保留列名在name属性中)。将列表传递给__getitem__的主要目的是对多个列进行键控。

要了解方括号[]在类上的工作原理,请查看其__getitem__方法。

来自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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接