Pandas使用groupby和count()对含Key的三列数据分组统计
pandas多列联合分组统计实现方法
需求说明
现有包含Key、Name、location三列的数据集,需要对包含Key在内的三列做联合比对,借助groupby()与count()方法实现分组统计计数,最终按指定格式输出:按location字段分组,同组下不重复的Name值拼接展示,同时统计每个Name对应的记录数生成COUNT字段。
实现代码
import pandas as pd # 加载/构造数据集 df = pd.DataFrame([ [112, 'A', 'ABCD'], [112, 'A', 'ABCD'], [128, 'B', 'BCDE'], [138, 'C', 'ABCD'], [128, 'B', 'BCDE'], [112, 'A', 'ABCD'], [115, 'D', 'BCDE'] ], columns=['Key', 'Name', 'location']) # 三列联合分组统计计数 # 统计三列完全一致的记录总条数用这行 stat = df.groupby(['location', 'Name', 'Key'], as_index=False).agg(cnt=('Key', 'count')) # 如果要统计三列去重后的唯一组合数,把上面一行替换为下面这行即可 # stat = df[['location', 'Name', 'Key']].drop_duplicates().assign(cnt=1) # 按location二次聚合,拼接成要求的输出格式 result = stat.groupby('location', as_index=False).apply( lambda g: pd.Series({ 'Name': ','.join(g['Name'].tolist()), 'COUNT': ','.join([f"{n}->{c}" for n,c in zip(g['Name'], g['cnt'])]) }) ) print(result)
输出结果
按三列统计总记录数的输出:
| location | Name | COUNT |
|---|---|---|
| ABCD | A,C | A->3,C->1 |
| BCDE | B,D | B->2,D->1 |
切换为去重唯一组合计数时,输出和示例格式完全匹配:
| location | Name | COUNT |
|---|---|---|
| ABCD | A,C | A->1,C->1 |
| BCDE | B,D | B->1,D->1 |
注:代码预留了两种计数逻辑的切换入口,可根据实际业务需求选择对应实现。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

