pandas何时输出一系列与数据帧?

时间:2016-11-13 19:08:12

标签: python pandas dataframe

我正在https://github.com/brandon-rhodes/pycon-pandas-tutorial/blob/master/Exercises-3.ipynb处理pandas教程。它在WEB-INF数据框上有练习,其中的一个示例是

enter image description here

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

第一个代码是:

cast

它使c2成为一个系列。但是,如果我只是在'n'周围添加另一个方括号,如下面的代码所示,我得到一个数据帧。

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

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

2 个答案:

答案 0 :(得分:1)

如果您传递列表列表,则会获得一个DataFrame。列表有多少元素并不重要。如果它仅在单项列表的情况下返回系列,那将会令人困惑,因为有时您的列表可能是以编程方式生成的。例如,假设你有:

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

根据当前行为,您知道x始终是DataFrame,因为columns_to_use是一个列表。如果不是这种情况,您可能会在以后遇到错误,因为您不会提前知道x是否为Series或DataFrame,因此您不会知道,例如,您可以调用哪些方法在后面的代码中。

答案 1 :(得分:0)

基本上,如果您在__getitem__Seriesnp.ndarrayIndex的数据框上传递list,那么您将获得一个数组( DataFrame)。

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

DataFrameGroupByDataFrame的行为类似,如果你传递任何前面列出的对象(显然加上元组),你将得到一个双维对象(DataFrame),否则它会尝试检索一维对象(系列)

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

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

在第二个代码块中,将包含字符串的列表传递给__getitem__

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

[]有多重含义。

传递一个元素的列表通常不是很有用,但是在顶部很好地打印列名称(但系列仍然保留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)