Pandas简单实现groupby分组统计

Pandas实现groupby分组统计

类似SQL:
select city.max(temperature) from city_weather groupby by city

groupby: 先对数据分组,然后在每个分组上应用聚合函数、转换函数

import pandas as pd
import numpy as np

%matplotlib inline
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)})
df
ABCD
0fooone-0.1907411.612948
1barone-0.7812091.002117
2footwo0.858491-0.178429
3barthree-0.2805590.083816
4footwo0.214302-0.107717
5bartwo-0.134638-1.604365
6fooone-2.108731-0.653819
7foothree0.414685-1.717435

1、分组使用聚合函数做数据统计

1、单个列groupby,查询所有数据列的统计

df.groupby('A').sum()
CD
A
bar-1.196406-0.518431
foo-0.811994-1.044452

1、groupby中的A变成了数据的索引列
2、B列不是数字,所以被自动忽略

2、多个列groupby,查询所有数据列的统计

df.groupby(['A','B']).mean()
CD
AB
barone-0.7812091.002117
three-0.2805590.083816
two-0.134638-1.604365
fooone-1.1497360.479564
three0.414685-1.717435
two0.536397-0.143073

(A,B)成对变成了二级索引,不想改变原来索引。加一个as_index=False

df.groupby(['A','B'],as_index=False).mean()
ABCD
0barone-0.7812091.002117
1barthree-0.2805590.083816
2bartwo-0.134638-1.604365
3fooone-1.1497360.479564
4foothree0.414685-1.717435
5footwo0.536397-0.143073

3、同时查看多种数据统计

df.groupby('A').agg([np.sum,np.mean,np.std])
CD
summeanstdsummeanstd
A
bar-1.196406-0.3988020.339116-0.518431-0.172811.322055
foo-0.811994-0.1623991.151755-1.044452-0.208891.204567

列变成了多级索引

4、查看单列的结果数据统计

# 方法1:预过滤,性能更好
df.groupby('A')['C'].agg([np.sum,np.mean,np.std])
summeanstd
A
bar-1.196406-0.3988020.339116
foo-0.811994-0.1623991.151755
#方法2
df.groupby('A').agg([np.sum,np.mean,np.std])['C']
summeanstd
A
bar-1.196406-0.3988020.339116
foo-0.811994-0.1623991.151755

5、不同列使用不同的聚合函数

df.groupby('A').agg({'C':np.sum,'D':np.std})
CD
A
bar-1.1964061.322055
foo-0.8119941.204567
  • 欢迎关注个人公众号
### 如何在 Pandas GroupBy 结果中添加列名 当使用 `groupby` 对数据进行分组并应用聚合操作后,有时会发现生成的结果缺少显式的列名。为了确保结果具有清晰的表头,可以通过以下方式来设置或修改列名。 #### 使用 rename 方法重命名 Series 或 DataFrame 的索引名称 如果通过 `groupby().agg()` 得到的是一个 Series,则可以直接转换成 DataFrame 并利用 `rename_axis` 来指定新的轴标签[^1]: ```python import pandas as pd import numpy as np # 创建示例数据集 df = pd.DataFrame({ 'A': ['foo', 'bar', 'foo', 'bar'] * 3, 'B': np.random.randint(0, 100, size=12), }) # 执行 groupby 和 agg 操作 result_series = df.groupby('A')['B'].sum() # 将 Series 转换为 DataFrame 并设置新列名为 "Sum" result_df_with_header = result_series.to_frame(name='Sum') print(result_df_with_header) ``` #### 设置多级索引后的列名 对于更复杂的场景,比如执行多个聚合函数时产生的 MultiIndex 列情况,可以先获取原始列名再重新定义它们[^3]: ```python # 应用多个聚合函数 multi_agg_result = df.groupby('A')['B'].agg([np.size, np.sum, np.mean]) # 获取当前列级别名称 current_columns = multi_agg_result.columns.tolist() new_column_names = ["Count", "Total", "Average"] # 替换原有的列名 final_result = multi_agg_result.set_axis(new_column_names, axis=1) print(final_result) ``` #### 处理复杂嵌套结构的情况 如果有更加复杂的嵌套结构(例如由多重键组成的分组),则可以在调用 `unstack()` 后调整层次化的列名[^5]: ```python complex_grouping = ( df.assign(DummyColumn=1) # 添加辅助列用于 unstack .pivot_table( index=['DummyColumn'], columns=['A'], values='B', aggfunc=[len], fill_value=0 ) .droplevel(level=0, axis=1) # 移除不必要的层级 .reset_index(drop=True) .set_axis(['Foo_Count', 'Bar_Count'], axis=1) # 自定义最终列名 ) print(complex_grouping) ``` 以上三种方法可以根据实际需求灵活运用,在不同的情况下都能有效地为 `groupby` 分组统计的结果添加合适的表头。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值