您的位置:首页 > 其它

Pandas GroupBy 分组(分割-应用-组合)

2017-04-30 11:51 323 查看
http://pandas.pydata.org/pandas-docs/stable/groupby.html#group-by-split-apply-combine

简介

分组(group by)一般是指三个过程

- 分割(Splitting)将数据按照某个标准分组

- 应用(Applying)对每个分组分别使用函数

- 组合(Combining)将结果组合成数据框

当然还有更多的操作比如:

- 聚合(Aggregation) 同时对分组进行多种计算,比如同时计算sum和means

- 变换(Transformation) 标准化分组数据,根据组数据填充组空值

- Filtration(

groupby对象具体信息

请参考Pandas GroupBy对象 索引与迭代

apply函数

In [123]: df
Out[123]:
A      B         C         D
0  foo    one -0.919854 -1.131345
1  bar    one -0.042379 -0.089329
2  foo    two  1.247642  0.337863
3  bar  three -0.009920 -0.945867
4  foo    two  0.290213 -0.932132
5  bar    two  0.495767  1.956030
6  foo    one  0.362949  0.017587
7  foo  three  1.548106 -0.016692

In [124]: grouped = df.groupby('A')
In [125]: grouped['C'].apply(lambda x: x.describe()) # 描述每组信息
Out[125]:
A
bar  count    3.000000
mean     0.147823
std      0.301765
min     -0.042379
25%
4000
-0.026149
50%     -0.009920
75%      0.242924
...
foo  mean     0.505811
std      0.966450
min     -0.919854
25%      0.290213
50%      0.362949
75%      1.247642
max      1.548106
Name: C, dtype: float64


使用多种函数agg()

相同的函数

如果是一列,不同值的计算,使用列表

In [56]: grouped = df.groupby('A')

In [57]: grouped['C'].agg([np.sum, np.mean, np.std])
Out[57]:
sum      mean       std
A
bar  0.443469  0.147823  0.301765
foo  2.529056  0.505811  0.966450


不同的函数

如果是多列,不同值的计算,使用字典

In [60]: grouped.agg({'C' : np.sum,
....:              'D' : lambda x: np.std(x, ddof=1)})
....:
Out[60]:
C         D
A
bar  0.443469  1.490982
foo  2.529056  0.645875


转变数据框transformation

转变函数(transform)中需要返回一个和分组块(group chunk)同样大小的结果,比如我们需要标准化每一个分组的数据:

In [66]: index = pd.date_range('10/1/1999', periods=1100)

In [67]: ts = pd.Series(np.random.normal(0.5, 2, 1100), index)

In [68]: ts = ts.rolling(window=100,min_periods=100).mean().dropna()
In [71]: key = lambda x: x.year#使用年来分组

In [72]: zscore = lambda x: (x - x.mean()) / x.std()#标准化

In [73]: transformed = ts.groupby(key).transform(zscore)#使用索引的年份来分组,然后标准化各组数据
In [80]: compare = pd.DataFrame({'Original': ts, 'Transformed': transformed})# 做出图形




过滤Filtration

filter方法返回一个子集(subset),这个是针对组的过滤,而不是针对组中的值过滤。比如我们只想要组长度大于2的分组:

In [105]: dff = pd.DataFrame({'A': np.arange(8), 'B': list('aabbbbcc')})

In [106]: dff.groupby('B').filter(lambda x: len(x) > 2)
Out[106]:
A  B
2  2  b
3  3  b
4  4  b
5  5  b
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: