
本文详解如何基于指定列(如sitecode)将dataframe转换为字典,自动合并重复键对应的多行数据为子列表,避免键冲突,并提供可直接运行的代码示例与关键注意事项。
本文详解如何基于指定列(如sitecode)将dataframe转换为字典,自动合并重复键对应的多行数据为子列表,避免键冲突,并提供可直接运行的代码示例与关键注意事项。
在实际数据处理中,常需将Pandas DataFrame按某一列(如SITECODE)分组,并将其余列的每行数据构造成嵌套列表,最终形成以该列为键、值为二维列表(即“列表的列表”)的字典结构。这与标准的set_index().to_dict()不同——后者无法处理重复键,会直接覆盖或报错。
正确做法是使用 groupby() 配合 apply() 和 values.tolist():
import pandas as pd
df = pd.DataFrame({
'SL': ['1', '2', '3', '4', '5'],
'SITECODE': ['CMCND1', 'CPHGN7', 'LXRPR1', 'LXRPR1', 'LXRPR1'],
'TECH': ['3G', '2G', '4G', '3G', '4G'],
'PRIORITY': ['P1', 'P2', 'P2', 'P3', 'P3']
})
# ✅ 正确:按 SITECODE 分组,每组转为行列表(保留所有重复键)
result = (
df.groupby("SITECODE")
.apply(lambda g: g[['SL', 'TECH', 'PRIORITY']].values.tolist(), include_groups=False)
.to_dict()
)
print(result)输出结果为合法的Python字典:
{
'CMCND1': [['1', '3G', 'P1']],
'CPHGN7': [['2', '2G', 'P2']],
'LXRPR1': [['3', '4G', 'P2'], ['4', '3G', 'P3'], ['5', '4G', 'P3']]
}⚠️ 注意事项:
- 显式指定列顺序:g[['SL', 'TECH', 'PRIORITY']] 确保输出子列表字段顺序可控(避免因DataFrame列序变动导致结果不稳定);
- include_groups=False(Pandas ≥ 1.5.0)可安全忽略弃用警告;若使用旧版本,可省略该参数;
- 若需返回字典值为 dict 而非 list(如每行转为键值对),可改用 g.to_dict('records');
- 不推荐使用 set_index('SITECODE').T.to_dict('list'),因其本质是转置后按列聚合,无法实现按行分组,且重复索引会导致数据丢失或异常。
此方法兼具健壮性与可读性,适用于ETL、配置生成、API响应组装等典型场景。

















