如何用字典推导式将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
相关产品推荐
相关产品推荐

