You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用字典推导式将Pandas DataFrame转为指定格式字典?

问题描述

我有一个包含城市及其相关信息的Pandas DataFrame,需要使用字典推导式,以城市所属国家(来自df['country']列)为字典的键,对应国家的城市列表(来自df['city']列)为值,生成目标字典。

尝试多种方法后始终报错,提示Pandas序列是可变且不可哈希的;转为字符串列表后仍出现同样错误。此外不清楚如何在字典推导式中添加条件,将城市归入对应国家键的列表值中。

尝试的代码如下:

key = df['country'].tolist()
value = df['city']
Megacities_dict = {key: value for value in df if key == df['country'] }

预期输出格式:

{'Japan': ['Osaka', 'Tokyo', ...], 'China': ['Beijing'...], ...}

实际得到的错误信息:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
解决方案

代码错误原因:

  • 直接将整个country列表和city列赋值给key、value,未实现逐行数据的遍历匹配
  • 推导式中for value in df实际是遍历DataFrame的列名,而非每行数据
  • 条件key == df['country']用列表与Series做比较,触发模糊真值判断错误

以下是两种正确实现方式:

方法一:分组+字典推导式(高效简洁)

利用Pandas分组功能直接生成目标字典,这是最优方案:

Megacities_dict = {country: group['city'].tolist() for country, group in df.groupby('country')}
  • df.groupby('country')将数据按国家分组,每个分组对应一个国家的所有行数据
  • 遍历分组时,country作为字典的键,分组内的city列转为列表后作为对应值

方法二:逐行遍历构建(适合理解逻辑)

如果想从基础逻辑入手,先初始化空字典,再逐行添加城市到对应国家的列表中:

Megacities_dict = {}
for _, row in df.iterrows():
    country = row['country']
    city = row['city']
    Megacities_dict.setdefault(country, []).append(city)

也可以写成字典推导式的形式(本质是利用列表推导式完成遍历操作):

Megacities_dict = {}
_ = [Megacities_dict.setdefault(row['country'], []).append(row['city']) for _, row in df.iterrows()]

不过这种写法效率低于分组方式,数据量大时更推荐用groupby实现。

内容的提问来源于stack exchange,提问作者Fran Rodriguez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 00:55:20