数据分析笔记_第十章_数据聚合与分组运算

本文深入探讨了Python数据分析中的数据聚合与分组运算,包括GroupBy机制、数据聚合、apply方法的应用、分位数和桶分析,以及如何处理缺失值和计算分组加权平均数。通过实例展示了如何对数据进行分组、聚合统计,如计算分组平均值、分位数,以及如何根据分组填充缺失值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据聚合与分组运算

1 GroupBy机制

首先来看看下面这个非常简单的表格型数据集(以DataFrame的形式):

In [10]: 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)})
In [11]: df
Out[11]:
  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

假设你想要按key1进行分组,并计算data1列的平均值:访问data1,并根据key1调用groupby:

In [12]: grouped = df['data1'].groupby(df['key1'])
In [13]: grouped
Out[13]: <pandas.core.groupby.SeriesGroupBy object at 0x7faa31537390>

In [14]: grouped.mean()
Out[14]:
key1
a 0.746672
b -0.537585
Name: data1, dtype: float64

如果我们一次传入多个数组的列表,就会得到不同的结果:

In [15]: means = df['data1'].groupby([df['key1'], df['key2']]).mean()
In [16]: means
Out[16]:
 key1 key2
a one 0.880536
two 0.478943
b one -0.519439
two -0.555730
Name: data1, dtype: float64

GroupBy的size方法,它可以返回一个含有分组大小的Series:

In [23]: df.groupby(['key1', 'key2']).size()
Out[23]:
 key1 key2
a one 2
two 1
b one 1
two 1
dtype: int64

选取一列或列的子集

尤其对于大数据集,很可能只需要对部分列进行聚合。如果只需计算data2列的平均值并以DataFrame形式得到结果,可以这样写:

In [31]: df.groupby(['key1', 'key2'])[['data2']].mean()
Out[31]:
data2
key1 key2
a    one 1.319920
     two 0.092908
b    one 0.281746
     two 0.769023

根据索引级别分组

In [47]: columns = pd.MultiIndex.from_arrays([['US', 'US', 'US', 'JP',
'JP'],
....: [1, 3, 5, 1, 3]],
....: names=['cty', 'tenor'])
In [48]: hier_df = pd.DataFrame(np.random.randn(4, 5), columns=columns)
In [49]: hier_df
Out[49]:
cty US JP
tenor 1 3 5 1 3
0 0.560145 -1.265934 0.119827 -1.063512 0.332883
1 -2.359419 -0.199543 -1.541996 -0.970736 -1.307030
2 0.286350 0.377984 -0.753887 0.331286 1.349742
3 0.069877 0.246674 -0.011862 1.004812 1.327195

要根据级别分组,使用level关键字传递级别序号或名字:

In [50]: hier_df.groupby(level='cty', axis=1).count()
Out[50]:
cty JP US
0 2 3
1 2 3
2 2 3
3 2 3

2 数据聚合

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值