Pandas之数据分组

1. pd.groupby()

df.groupby(
    by=None, # mapping, function, label, or list of labels
    axis=0, # {0 or 'index', 1 or 'columns'}, default 0
    level=None, # int, level name, or sequence of such, default None
    as_index=True, # bool, default True
    sort=True,
    group_keys=True, # bool, default True
    squeeze=False, # bool, default False
    observed=False, # bool, default False
    **kwargs,
)

作用:

  • 数据分组;
  • 数据标准化

2. groupby()的基本操作

  1. 按列取值
  2. 按组迭代,GroupBy对象支持直接按组进行迭代;
  3. 调用方法,GroupBy对象可以调用对象,比如describe()

3. 累计aggregate

aggregate()可以支持更复杂的操作,比如字符串、函数或者函数列表,并且能一次性计算所有累计值。

df = pd.DataFrame({'key':list('ABCABC'),
                  'data1':range(6),
                  'data2':np.random.randint(0,10,6)},
                 columns=['key','data1','data2'])
print(df)
  key  data1  data2
0   A      0      8
1   B      1      3
2   C      2      6
3   A      3      4
4   B      4      8
5   C      5      5
#######################
print(df.groupby('key').aggregate([min,max,np.median]))
    data1            data2           
      min max median   min max median
key                                  
A       0   3    1.5     4   8    6.0
B       1   4    2.5     3   8    5.5
C       2   5    3.5     5   6    5.5
# 也可以使用Python字典指定不同列需要累计的函数
print(df.groupby('key').aggregate({'data1':'min',
                            'data2':'max'}))
     data1  data2
key              
A        0      8
B        1      8
C        2      6

4. 过滤filter

过滤操作可以让你按照分组的属性丢弃若干数据。

print(df.groupby('key').filter(lambda x: x['data2'].std() < 3))
  key  data1  data2
0   A      0      8
2   C      2      6
3   A      3      4
5   C      5      5

5. 转换transform

累计操作返回的是对组内全量数据缩减过的结果,而转换操作返回一个新的全量数据。数据经过转换后,其形状与原来的输入数据是一样的。常见的例子就是将每一组的样本数据减去各组的均值,实现数据标准化。

print(df.groupby('key').transform(lambda x : x - x.mean()))
   data1  data2
0   -1.5    2.0
1   -1.5   -2.5
2   -1.5    0.5
3    1.5   -2.0
4    1.5    2.5
5    1.5   -0.5

6. 应用apply

apply()方法让你可以在每个组上应用任意方法。
例:将第一列数据以第二列的和为基数进行标准化:

def norm_by_data2(x):
    x['data1'] /= x['data2'].sum()
    return x
print(df.groupby('key').apply(norm_by_data2))

  key     data1  data2
0   A  0.000000      8
1   B  0.090909      3
2   C  0.181818      6
3   A  0.250000      4
4   B  0.363636      8
5   C  0.454545      5
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值