我正在https://github.com/brandon-rhodes/pycon-pandas-tutorial/blob/master/Exercises-3.ipynb处理pandas教程。它在WEB-INF
数据框上有练习,其中的一个示例是
有两个命令几乎相似,除了一个小差异,一个输出一个系列而另一个输出一个数据帧。我不明白为什么。
第一个代码是:
cast
它使c2成为一个系列。但是,如果我只是在'n'周围添加另一个方括号,如下面的代码所示,我得到一个数据帧。
c1 = cast[cast.title == 'The Pink Panther']
c2 = c1.groupby('year')['n'].max()
type(c2)
有人可以帮我解释一下吗?谢谢!
答案 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__
,Series
,np.ndarray
或Index
的数据框上传递list
,那么您将获得一个数组( DataFrame
)。
否则__getitem__
将尝试检索一列(Series
)。这种情况包括字符类型,数字,自定义类等。
DataFrameGroupBy
与DataFrame
的行为类似,如果你传递任何前面列出的对象(显然加上元组),你将得到一个双维对象(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)