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

如何基于Pandas DataFrame分组合并列字符串生成指定格式字典?

Pandas DataFrame 转指定格式字典(支持多列作为键)

先构造示例数据

首先创建你提供的DataFrame,方便复现测试:

import pandas as pd

data = {
    'Column A': ['Apple', 'Apple', 'Banana', 'Banana'],
    'Column B': ['red', 'red', 'yellow', 'yellow'],
    'Column C': ['Texas', 'California', 'Indiana', 'Florida']
}
df = pd.DataFrame(data)

两列作为键的实现

通过groupby分组,再将分组键拼接为字符串,值转为列表:

# 按Column A和Column B分组,聚合Column C为列表,得到元组键的字典
temp_dict = df.groupby(['Column A', 'Column B'])['Column C'].agg(list).to_dict()
# 将元组键转为空格拼接的字符串
final_dict = {' '.join(key): value for key, value in temp_dict.items()}

执行后final_dict就是你需要的格式:
{ "Apple red" : ['Texas', 'California'], "Banana yellow" : ['Indiana', 'Florida'] }

支持多列作为键的扩展

如果需要3列及以上作为键,只需修改groupby的列列表,再重复键拼接步骤即可。比如新增Column D列的示例:

# 构造多列示例数据
data_multi = {
    'Column A': ['Apple', 'Apple', 'Banana', 'Banana', 'Apple'],
    'Column B': ['red', 'red', 'yellow', 'yellow', 'green'],
    'Column C': ['Texas', 'California', 'Indiana', 'Florida', 'Washington'],
    'Column D': ['small', 'large', 'small', 'large', 'small']
}
df_multi = pd.DataFrame(data_multi)

# 按Column A、Column B、Column D三列分组
temp_multi_dict = df_multi.groupby(['Column A', 'Column B', 'Column D'])['Column C'].agg(list).to_dict()
# 拼接多列键为字符串
final_multi_dict = {' '.join(key): value for key, value in temp_multi_dict.items()}

最终final_multi_dict的键会是"Apple red small"、"Apple red large"这类拼接后的字符串,对应的值是分组后的Column C列表。

另一种更直观的写法

你也可以先在DataFrame中生成拼接好的键列,再分组聚合:

# 两列键的情况
df['key'] = df['Column A'] + ' ' + df['Column B']
final_dict_alt = df.groupby('key')['Column C'].agg(list).to_dict()

# 多列键的情况
df_multi['key'] = df_multi['Column A'] + ' ' + df_multi['Column B'] + ' ' + df_multi['Column D']
final_multi_dict_alt = df_multi.groupby('key')['Column C'].agg(list).to_dict()

这种写法逻辑更直白,适合快速理解。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 11:50:20