在上一篇文章中介紹了panda合并操作的主要用法(http://www.reibang.com/p/fe47c70d31f9)绰垂,本篇將給大家介紹pandas的另一個常用的操作兽肤,groupby翻斟。
本篇內(nèi)容參考自http://pandas.pydata.org/pandas-docs/stable/groupby.html#groupby
groupby
使用groupby跋涣,我們是在進行下面的一個或多個操作:
- Spliting:根據(jù)條件分組數(shù)據(jù)
- Applying : 在各個分組上執(zhí)行函數(shù)
- Combining : 合并結(jié)果
拆分單個對象 into groups
常用方式為:
# default is axis=0
>>> grouped = obj.groupby(key)
>>> grouped = obj.groupby(key, axis=1)
>>> grouped = obj.groupby([key1, key2])
如:
In [1]: df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
...: 'foo', 'bar', 'foo', 'foo'],
...: 'B' : ['one', 'one', 'two', 'three',
...: 'two', 'two', 'one', 'three'],
...: 'C' : np.random.randn(8),
...: 'D' : np.random.randn(8)})
...:
In [2]: df
Out[2]:
A B C D
0 foo one 0.469112 -0.861849
1 bar one -0.282863 -2.104569
2 foo two -1.509059 -0.494929
3 bar three -1.135632 1.071804
4 foo two 1.212112 0.721555
5 bar two -0.173215 -0.706771
6 foo one 0.119209 -1.039575
7 foo three -1.044236 0.27186
In [3]: grouped = df.groupby('A')
In [4]: grouped = df.groupby(['A', 'B'])
返回的是GroupBy 對象犁嗅,可以看到罩缴,在需要操作之前不會發(fā)生Spliting他爸。創(chuàng)建GroupBy對象只是保證傳遞了有效的映射咪橙。接下來再進行操作夕膀。如:
In [13]: df2 = pd.DataFrame({'X' : ['B', 'B', 'A', 'A'], 'Y' : [1, 2, 3, 4]})
#groupby之后分組求和
In [14]: df2.groupby(['X']).sum()
Out[14]:
Y
X
A 7
B 3
#可以指定sort=False來關(guān)閉group操作中的排序,從而加速操作
In [15]: df2.groupby(['X'], sort=False).sum()
Out[15]:
Y
X
B 3
A 7
我們可以通過get_group()方法獲得group的結(jié)果
In [16]: df3 = pd.DataFrame({'X' : ['A', 'B', 'A', 'B'], 'Y' : [1, 4, 3, 2]})
In [17]: df3.groupby(['X']).get_group('A')
Out[17]:
X Y
0 A 1
2 A 3
In [18]: df3.groupby(['X']).get_group('B')
Out[18]:
X Y
1 B 4
3 B 2
GroupBy object 屬性
可以通過.groups屬性獲取groupby對象的group屬性美侦,如:
In [19]: df.groupby('A').groups
Out[19]:
{'bar': Int64Index([1, 3, 5], dtype='int64'),
'foo': Int64Index([0, 2, 4, 6, 7], dtype='int64')}
In [21]: grouped = df.groupby(['A', 'B'])
In [22]: grouped.groups
Out[22]:
{('bar', 'one'): Int64Index([1], dtype='int64'),
('bar', 'three'): Int64Index([3], dtype='int64'),
('bar', 'two'): Int64Index([5], dtype='int64'),
('foo', 'one'): Int64Index([0, 6], dtype='int64'),
('foo', 'three'): Int64Index([7], dtype='int64'),
('foo', 'two'): Int64Index([2, 4], dtype='int64')}
In [23]: len(grouped)
Out[23]: 6
groupby多個index
如下創(chuàng)建一個兩層的index:
In [27]: arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
....: ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]
....:
In [28]: index = pd.MultiIndex.from_arrays(arrays, names=['first', 'second'])
In [29]: s = pd.Series(np.random.randn(8), index=index)
In [30]: s
Out[30]:
first second
bar one -0.919854
two -0.042379
baz one 1.247642
two -0.009920
foo one 0.290213
two 0.495767
qux one 0.362949
two 1.548106
dtype: float64
我們可以通過任何一層來對數(shù)據(jù)進行操作产舞,如:
In [31]: grouped = s.groupby(level=0)
In [32]: grouped.sum()
Out[32]:
first
bar -0.962232
baz 1.237723
foo 0.785980
qux 1.911055
dtype: float64
或者這么指定level
In [34]: s.sum(level='second')
Out[34]:
second
one 0.980950
two 1.991575
dtype: float64