通过大熊猫的操作分组

时间:2017-06-08 13:56:10

标签: python pandas

我正在使用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是没有链接到州和年份的地方。我不打算如何产生输出。请解释

1 个答案:

答案 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来分组。

相关问题