Python中如何将CSV导入的DataFrame转换为按国家分组的嵌套字典
实现方案
你之前用to_dict('records')拿到的扁平列表、用groupby没出预期结果,核心是这两个方法本身不会自动把日期列、病例数值拆成两个平行的数组结构,需要手动做一次结构转换。
直接用下面的代码就能生成完全匹配要求的字典:
import pandas as pd # 读取你的CSV,分隔符按实际文件格式调整即可 df = pd.read_csv("你的文件路径.csv") # 除国家列之外的所有列都是日期,作为所有国家共用的time序列 date_cols = df.columns.drop("Country/Region").tolist() # 初始化目标字典 result = {} # 逐行遍历组装数据 for _, row in df.iterrows(): country = row["Country/Region"] result[country] = { "time": date_cols, "cases": row[date_cols].tolist() }
针对你给出的示例数据,最终输出的结构完全匹配要求:
{ "Afghanistan": { "time": ["1/22/20", "1/23/20", "1/24/20"], "cases": [100, 200, 300] }, "Albania": { "time": ["1/22/20", "1/23/20", "1/24/20"], "cases": [400, 500, 0] }, "Algeria": { "time": ["1/22/20", "1/23/20", "1/24/20"], "cases": [20, 30, 70] } }
常见踩坑提示
- 如果原始数据里有重复的国家行,记得提前按国家维度聚合数值(比如求和、取最大值)再遍历,不然同国家的后序行会覆盖字典里已有的键值
- 别直接拿
to_dict('index')的结果硬套,它返回的是单国家下“日期名:病例数”的嵌套键值对,依然需要二次拆分才能得到平行的time和cases列表,逻辑和上面的遍历写法是一致的 - 之前用
groupby没出结果,本质是分组操作只是把同国家的行聚到一起,不会自动生成你要求的两个固定键名的平行列表,最后还是要做结构重组才能得到目标格式
内容的提问来源于stack exchange,提问作者icatalan
相关产品推荐
相关产品推荐

