在Pandas中基于Country列统计Value列各值计数并生成分类列
Pandas分组统计并重塑DataFrame解决方案
原始数据
Country | Value England 1 England 1 England 2 USA 3 USA 3 USA 2 Germany 1 Thailand 2
目标效果
Country | Value Cat 1 cat 2 cat 3 England 1 2 1 0 USA 3 0 1 2 Germany 1 1 0 0 Thailand 2 0 1 0
实现代码
import pandas as pd # 构造原始DataFrame data = { 'Country': ['England', 'England', 'England', 'USA', 'USA', 'USA', 'Germany', 'Thailand'], 'Value': [1, 1, 2, 3, 3, 2, 1, 2] } df = pd.DataFrame(data) # 1. 统计每组各Value的出现次数,转成宽表并补全缺失列 counts_df = df.groupby('Country')['Value'].value_counts().unstack(fill_value=0) counts_df = counts_df.rename(columns={1: 'Cat 1', 2: 'cat 2', 3: 'cat 3'}) # 确保三个分类列都存在,避免部分国家无对应值时列缺失 for col in ['Cat 1', 'cat 2', 'cat 3']: if col not in counts_df.columns: counts_df[col] = 0 # 2. 获取每个国家对应的代表Value(取出现次数最多的众数) value_df = df.groupby('Country')['Value'].agg(lambda x: x.mode().iloc[0]) # 3. 合并结果并调整列顺序 result_df = pd.concat([value_df, counts_df], axis=1).reset_index() result_df = result_df[['Country', 'Value', 'Cat 1', 'cat 2', 'cat 3']] # 输出结果 print(result_df)
代码说明
- 统计计数:通过
groupby结合value_counts统计每个国家下各Value的出现次数,unstack将长表转为宽表,fill_value=0填充未出现的值为0。 - 保留代表Value:使用
mode().iloc[0]取每组出现次数最多的Value(众数),如果存在多个众数则取第一个,和示例逻辑一致。 - 合并与调整:将代表Value和计数结果合并,调整列顺序与目标格式匹配。
内容的提问来源于stack exchange,提问作者Nithin Ramayanam
相关产品推荐
相关产品推荐

