Python pandas 按国家分组统计操作项计数并输出指定格式结果
原有实现的核心问题
- 数据构建逻辑错误:直接将
pd.MultiIndex对象作为pd.DataFrame()的入参,本质是把多层索引当成单列数据,没有将国家、操作类型拆分为两个独立的表格字段,后续所有统计都基于错误结构展开 - 缺失核心统计逻辑:全程没有对「国家+操作类型」的组合做频次计数,只是把同国家对应的操作类型收集成普通列表,完全没有计算每个操作的出现次数
- 输出结构不匹配:最终生成的是包含国家列表、操作列表的普通两列DataFrame,和要求的嵌套字典结构存在本质偏差
正确实现方案
首先导入依赖并加载题目给定的原始数据:
import pandas as pd # 对应题目给定的原始数据条目 countrylist = ["India", "Malaysia", "Croatia", "India", "India", "Malaysia", "Malaysia"] opslist = ["A", "B", "C", "C", "C", "D", "A"]
先将原始列表组装为标准两列表格:
df = pd.DataFrame({ "country": countrylist, "operations": opslist })
方案1:pandas内置方法快速实现
通过分组+计数的链式操作直接生成目标结构,核心逻辑是按国家分组后,对操作类型做频次统计,转换为指定嵌套格式:
# 按国家分组,对操作类型做计数,直接转换为嵌套字典 result = df.groupby("country")["operations"].value_counts().unstack().to_dict("index")
注:pandas会自动剔除单元格值为NaN的键值对,最终输出的字典和目标格式完全一致:{"India":{"A":1,"C":2},"Malaysia":{"B":1,"A":1,"D":1},"Croatia":{"C":1}}
方案2:手动遍历实现(版本兼容性更强)
如果担心不同pandas版本的to_dict行为存在差异,可以通过遍历分组手动构建嵌套字典,逻辑更可控:
result = {} for country, group_data in df.groupby("country"): # 统计当前国家下各操作类型的出现次数,转换为字典 result[country] = group_data["operations"].value_counts().to_dict()
该方法不受unstack的空值逻辑影响,最终输出结构和目标完全匹配。
内容的提问来源于stack exchange,提问作者prj
相关产品推荐
相关产品推荐

