如何用Pandas聚合生成含总用户数及各语言用户数的统计表格?
Pandas 聚合统计问题
原始数据
原始DataFrame定义:
import pandas as pd d = pd.DataFrame({ 'country': ['France', 'France', 'Germany', 'Germany', 'France', 'Spain', 'Germany'], 'user': [1, 2, 3, 4, 5, 6, 7], 'age': [20, 32, 19, 28, 22, 36, 23], 'language': ['Python', 'C', 'Python', 'Python', 'Python', 'Go', 'Go'], })
数据预览:
country user age language 0 France 1 20 Python 1 France 2 32 C 2 Germany 3 19 Python 3 Germany 4 28 Python 4 France 5 22 Python 5 Spain 6 36 Go 6 Germany 7 23 Go
期望结果
需要生成如下统计表格:
TotalUser Python C Go France 3 2 1 1 Germany 3 2 0 1 Spain 1 0 0 1
问题
是否无需两次分组聚合即可直接生成目标格式的数据?若不能,如何将已实现的两个分组结果合并为目标格式?
回答
方法一:一次聚合直接生成目标格式
完全可以通过一次操作生成目标结果,推荐使用pivot_table或pd.crosstab,两种方式都能一步到位:
1. 使用pivot_table
result = d.pivot_table( index='country', columns='language', values='user', aggfunc='count', fill_value=0 ).reset_index() # 添加总用户数列 result['TotalUser'] = result[['Python', 'C', 'Go']].sum(axis=1) # 调整列顺序并设置索引 result = result[['country', 'TotalUser', 'Python', 'C', 'Go']].set_index('country')
输出结果与期望一致。
2. 使用pd.crosstab
# 统计各语言用户数 lang_counts = pd.crosstab(d['country'], d['language'], dropna=False).fillna(0) # 添加总用户数列 lang_counts['TotalUser'] = lang_counts.sum(axis=1) # 调整列顺序 lang_counts = lang_counts[['TotalUser', 'Python', 'C', 'Go']]
输出结果同样符合要求。
方法二:合并已有的两个分组结果
如果一定要基于你已得到的两个分组结果合并,可按以下步骤操作:
假设你已生成两个结果:
# 总用户数统计结果 total_df = d.groupby(['country']).size().reset_index(name='TotalUser') # 按国家+语言分组的统计结果(转换为宽表) lang_df = d[['country', 'language']].groupby(['country', 'language']).size().unstack(fill_value=0).reset_index()
合并并整理格式:
# 合并两个DataFrame merged = pd.merge(total_df, lang_df, on='country', how='left').fillna(0) # 设置country为索引并调整列顺序 merged = merged.set_index('country')[['TotalUser', 'Python', 'C', 'Go']]
最终得到的结果与期望完全匹配。
内容的提问来源于stack exchange,提问作者FooBar
相关产品推荐
相关产品推荐

