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

如何用Pandas GroupBy将DataFrame转换为指定结构的字典列表

用Pandas GroupBy实现分组字典列表需求

问题描述

现有如下DataFrame:

print(df)
business_id     software_id     quantity     price     inventory_level
   1234              abc           10        25.5            5
   4820              bce           40        21.9            2
   1492              abc           59        25.3            1
   1234              abc           55        11.3            0

需要生成一个字典列表,以business_id和software_id为分组键,其余字段组成的字典列表作为transactions字段,目标结构如下:

[
    {
        "business_id": 1234,
        "software_id": "abc",
        "transactions": [
            {"quantity": 10, "price": 25.5, "inventory_level":5},
            {"quantity": 55, "price": 11.3, "inventory_level":0},
        ]
    },
    # 其他分组项...
]

目前已实现低效的循环版本:

keys_l = ["business_id", "software_id"]
keys_df = df.filter(keys_l).drop_duplicates()

chunk_l = []
for _, row in keys_df.iterrows():
    
    # --- Subset original DataFrame ---
    chunk_df = df[(df[keys_l]==row).all(axis=1)]
    
    # --- Create baseline keys with keys ---
    chunk_dict = {key: value for key, value in zip(row.index, row.values)}
    
    # --- Add bucketed data points ---
    chunk_dict["transactions"] = chunk_df.drop(keys_l, axis=1).to_dict(orient="records")
   
    # --- Append to list to create a list of dictionaries ---
    chunk_l.append(chunk_dict)

希望用Pandas的groupby方法实现相同效果。

解决方案

用groupby配合apply和to_dict就能高效完成需求,无需循环:

keys_l = ["business_id", "software_id"]

result = (
    df.groupby(keys_l, as_index=False)
    .apply(lambda group: group.drop(keys_l, axis=1).to_dict(orient="records"))
    .rename("transactions")
    .reset_index()
    .to_dict(orient="records")
)

代码说明

  • groupby(keys_l, as_index=False):按指定的两个键分组,同时保持键为普通列(而非索引),便于后续整合
  • apply(lambda group: ...):对每个分组,删除键列后将剩余数据转换为字典列表,这就是transactions的内容
  • rename("transactions"):将apply生成的结果列重命名为transactions,匹配目标结构的字段名
  • reset_index():确保分组键和transactions列在同一DataFrame中,避免索引混乱
  • to_dict(orient="records"):将最终的DataFrame直接转换为目标格式的字典列表

该方法比循环实现效率更高,尤其是处理大数据集时,避免了循环中多次切片子集的性能开销,最终输出结果与循环版本完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 10:20:32