2016-11-13 68 views
2

我正在研究熊猫教程https://github.com/brandon-rhodes/pycon-pandas-tutorial/blob/master/Exercises-3.ipynb。它对cast数据帧练习,一个样品,其中是大熊猫何时输出一系列数据与一个数据帧?

enter image description here

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

第一个代码是:

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) 

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

回答

1

如果传递列的列表,您会得到一个DataFrame。列表中有多少元素并不重要。如果仅在单项清单的情况下返回一个系列,将会引起混淆,因为有时您的清单可能是以编程方式生成的。例如,假设你有:

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

在当前的行为,你知道x将永远是一个数据帧,因为columns_to_use是一个列表。如果情况并非如此,那么稍后您可能会遇到错误,因为您事先不知道x是否为Series或DataFrame,因此您不会知道,例如,您可以在以后的代码中调用哪些方法。

0

基本上,如果你在一个数据帧一Seriesnp.ndarrayIndex,或list通过__getitem__,那么你会得到一个数组(DataFrame)。

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

DataFrameGroupBy行为类似于DataFrame中,如果你通过任何前者列出的对象(加元组明显),你会得到一个两dimensonal对象返回(据帧),否则将尝试检索一维对象(系列)

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

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