基于DataFrame的Region与Country列分组汇总AREA_CODE并添加ALL值
问题描述
现有一个包含Region、Country、AREA_CODE三列的DataFrame,数据示例如下:
Region Country AREA_CODE =================================== AMER US A1 AMER CANADA A1 AMER US B1 AMER US A1
期望得到按Region分组,每个Region下再按Country分组的嵌套字典,每个Country对应的值为包含'ALL'及该国家唯一AREA_CODE的排序后列表,目标输出如下:
{ "AMER": { "US": ["ALL", "A1", "B1"], "CANADA": ["ALL", "A1"] } }
尝试了以下代码但报错:
df.drop_duplicates().groupby(["Region", "Country"]).groupby("Country")['AREA_CODE'].agg(lambda x: ["ALL"]+sorted(x.unique().tolist())).to_dict()
解决方案
你的代码错误在于在两级分组后再次嵌套groupby("Country"),属于多余且逻辑错误的操作。正确实现思路如下:
- 先去除重复的区域-国家-区号组合(减少后续计算量)
- 按
Region和Country进行两级分组,对每组的AREA_CODE去重、排序后添加'ALL' - 将分组结果转换为目标嵌套字典结构
正确代码
# 精准去除重复的区域-国家-区号组合 df_unique = df.drop_duplicates(subset=["Region", "Country", "AREA_CODE"]) # 分组处理并转换为嵌套字典 result = df_unique.groupby(["Region", "Country"])["AREA_CODE"].agg( lambda x: ["ALL"] + sorted(x.unique().tolist()) ).unstack().to_dict("index") print(result)
代码说明
drop_duplicates(subset=["Region", "Country", "AREA_CODE"]):仅保留唯一的区域-国家-区号组合,避免重复计算groupby(["Region", "Country"]):按区域、国家进行两级分组,确保每组对应一个国家的所有唯一区号agg(lambda x: ["ALL"] + sorted(x.unique().tolist())):对每组区号去重、排序后,在列表开头添加'ALL'unstack():将两级分组的结果转换为宽表,让Country成为列名to_dict("index"):将宽表转换为以Region为外层键、国家-区号列表为内层字典的嵌套结构
运行后即可得到符合期望的输出结果。
内容的提问来源于stack exchange,提问作者SM079
相关产品推荐
相关产品推荐

