我正在使用python在书籍数据分析中阅读pandas中的groupby函数。这里作者提到如下。
In [13]: df = DataFrame({'key1' : ['a', 'a', 'b', 'b', 'a'],
....: 'key2' : ['one', 'two', 'one', 'two', 'one'],
....: 'data1' : np.random.randn(5),
....: 'data2' : np.random.randn(5)})
In [14]: df
Out[14]:
data1 data2 key1 key2
0 -0.204708 1.393406 a one
1 0.478943 0.092908 a two
2 -0.519439 0.281746 b one
3 -0.555730 0.769023 b two
4 1.965781 1.246435 a one
In [21]: states = np.array(['Ohio', 'California', 'California', 'Ohio', 'Ohio'])
In [22]: years = np.array([2005, 2005, 2006, 2005, 2006])
In [23]: df['data1'].groupby([states, years]).mean()
Out[23]:
California 2005 0.478943
2006 -0.519439
Ohio 2005 -0.380219
2006 1.965781
我的问题是df [' data1']是如何分组的,因为df是没有链接到州和年份的地方。我不打算如何产生输出。请解释
答案 0 :(得分:1)
执行groupby
时,您可以传递
- by :mapping,function,str或iterable
- 用于确定groupby的组。如果by是一个函数,则调用对象索引的每个值。如果传递了dict或Series,则将使用Series或dict VALUES来确定组(系列的值首先对齐;请参阅.align()方法)。如果传递了ndarray,则使用这些值来确定组。 str或st列表可以通过self
中的列传递给group
<强> iterable
强>
在这种情况下,您传递了一个iterable或一个数组。使用数组时,最好与数据帧本身具有相同的长度。否则:
# Doesn't throw an error because the length of `df` is 5
df.groupby(list(range(5)))
# This does throw an error
df.groupby(list(range(6)))
KeyError: 0
pd.Series
考虑系列s
,其中我们指定长度与df
相同以及索引相同。
s = pd.Series(list(range(len(df))), df.index)
然后,当我们执行groupby
时,索引为aligned
df.groupby(s)
使用pd.Series
我们不必关心长度,因为,大熊猫会为我们做对齐
# also works
df.groupby(s.append(pd.Series(1, [len(df)])))
<强> str
强>
如果字符串被传递给gropuby
,pandas将查找具有该名称groupby
的列。
<强> function
强>
在传递函数的情况下,pandas会将该函数映射到df
的索引上,并使用生成的iterable
来分组。