数据聚合和分组操作

本文详细介绍了Pandas中的数据聚合和分组操作,包括GroupBy机制的拆分-应用-联合,遍历分组,选择列子集,使用字典和Series、函数进行分组,以及根据索引层级分组。还讨论了数据聚合,如逐列应用多函数,返回不含行索引的聚合结果。此外,文章展示了如何在分组基础上进行通用的拆分-应用-联合操作,例如分位数与桶分析,填充缺失值,随机采样和排列,分组加权平均和相关性,以及逐组线性回归。最后,探讨了数据透视表和交叉表的创建及其在数据分析中的应用。
摘要由CSDN通过智能技术生成

1. GroupBy 机制:拆分-应用-联合

  1. 数据包含在 pandas 对象中(Series/DataFrame 或其他数据结构),之后根据一个或多个键,在特定的轴上将数据分离到各组中,分组后一个函数应用到各组中产生新的值,并联合为一个结果对象;
  2. 分组键:与需要分组的轴向长度一致的值列表或数组;DataFrame 的列名的值;可以将分组轴向上的值和分组名称相匹配的字典或 Series;可以在轴索引或索引中的单个标签上调用的函数;
  • 分组键为 Series:
import numpy as np
import pandas as pd
df = pd.DataFrame({
   'key1': ['a', 'a', 'b', 'b', 'a'],
                  'key2': ['one', 'two', 'one', 'two', 'one'],
                  'data1': np.random.randn(5),
                  'data2': np.random.randn(5)})
# 根据 key1 标签计算 data1 列的均值
grouped = df['data1'].groupby(df['key1'])                     

df:

key1 key2 data1 data2
0 a one -0.556877 0.300878
1 a two 0.873811 0.742571
2 b one 1.997530 -0.632550
3 b two 0.966659 -1.091297
4 a one -0.199236 -0.990511

grouped:grouped 是一个 GroupBy 对象,还未进行任何的计算

<pandas.core.groupby.generic.SeriesGroupBy object at 0x000001C3A885C978>
grouped.mean()          # 调用 mean 方法计算分组的均值
key1
a    0.039233
b    1.482094
Name: data1, dtype: float64
means = df['data1'].groupby([df['key1'], df['key2']]).mean()
# 将多个数组作为列表传入

means: 结果为含多层索引的 Series

key1  key2
a     one    -0.378057
      two     0.873811
b     one     1.997530
      two     0.966659
Name: data1, dtype: float64
means.unstack()       # 拆分为 DataFrame
key2 one two
key1
a -0.378057 0.873811
b 1.997530 0.966659
  • 分组键为正确长度的任何数组:

# 使用正确长度的任何数组作为分组键
states = np.array(['Ohio', 'California', 'California', 'Ohio', 'Ohio'])
years = np.array([2005, 2005, 2006, 2005, 2006])
df['data1'].groupby([states, years]).mean()
California  2005    0.873811
            2006    1.997530
Ohio        2005    0.204891
            2006   -0.199236
Name: data1, dtype: float64
  • 分组键为 DataFrame 的列名:
df.groupby('key1').mean()                          # 传递列名作为分组键
data1 data2
key1
a 0.039233 0.017646
b 1.482094 -0.861923
df.groupby(['key1', 'key2']).mean()
data1 data2
key1 key2
a one -0.378057 -0.344816
two 0.873811 0.742571
b one 1.997530 -0.632550
two 0.966659 -1.091297

1.1 遍历各分组

  • GroupBy 对象支持迭代,会生成一个包含组名和数据块的2维元组序列
for name, group in df.groupby('key1'):
    print(name)
    print(group)
a
  key1 key2     data1     data2
0    a  one -0.556877  0.300878
1    a  two  0.873811  0.742571
4    a  one -0.199236 -0.990511
b
  key1 key2     data1     data2
2    b  one  1.997530 -0.632550
3    b  two  0.966659 -1.091297
  • 在多个分组键的情况下,元组中的第一个元素是键值的元组
for (k1, k2), group in df.groupby(['key1', 'key2']):
    print((k1, k2))
    print(group)
('a', 'one')
  key1 key2     data1     data2
0    a  one -0.556877  0.300878
4    a  one -0.199236 -0.990511
('a', 'two')
  key1 key2     data1     data2
1    a  two  0.873811  0.742571
('b', 'one')
  key1 key2    data1    data2
2    b  one  1.99753 -0.63255
('b', 'two')
  key1 key2     data1     data2
3    b  two  0.966659 -1.091297
pieces = dict(list(df.groupby('key1')))     # 计算出数据块的字典
pieces
{'a':   key1 key2     data1     data2
 0    a  one -0.556877  0.300878
 1    a  two  0.873811  0.742571
 4    a  one -0.199236 -0.990511, 'b':   key1 key2     data1     data2
 2    b  one  1.997530 -0.632550
 3    b  two  0.966659 -1.091297}
pieces['b']        # 字典的值为 DataFrame
key1 key2 data1 data2
2 b one 1.997530 -0.632550
3 b two 0.966659 -1.091297
  • 默认情况下,groupby 在 axis=0 的轴上分组,使用 axis=1 对列进行分组
grouped = df.groupby(df.dtypes, axis=1)
for dtype, group in grouped:
    print(dtype)
    print(group)
float64
      data1     data2
0 -0.556877  0.300878
1  0.873811  0.742571
2  1.997530 -0.632550
3  0.966659 -1.091297
4 -0.199236 -0.990511
object
  key1 key2
0    a  one
1    a  two
2    b  one
3    b  two
4    a  one

1.2 选择一列或所有列的子集

  • 将从 DataFrame 创建的 GroupBy 对象用列名称或列名称的数组进行索引时,会产生用于聚合的列子集的效果,即下面两种方法产生的结果是一样的:
df.groupby(['key1', 'key2'])[['data2']].mean()
df[['data2']].groupby([df['key1'],df['key2']]).mean()
data2
key1 key2
a one -0.344816
two 0.742571
b one -0.632550
two -1.091297
  • 如果传递的是列表或数组,则此索引操作返回的对象是分组的 DataFrame(如上), 如果只有单个列名作为标量传递,则为分组的 Series(如下):
s_grouped = df.groupby(['key1', 'key2'])['data2']
s_grouped.mean()
key1  key2
a     one    -0.344816
      two     0.742571
b     one    -0.632550
      two    -1.091297
Name: data2, dtype: float64

1.3 使用字典和 Series 分组

  • 分组信息可能会以非数组形式存在,考虑如下示例:
people = pd.DataFrame(np.random.randn(5, 5),
                     index=['Joe', 'Steve', 'Wes', 'Jim', 'Travis'],
                     columns=['a', 'b', 'c', 'd', 'e'])
people.iloc[2:3, [1, 2]] = np.nan
people
a b c d e
Joe 0.635451 -0.146126 -0.403298 -1.305932 0.049308
Steve -0.343671 -1.237591 0.765479 -0.123
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值