如何用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
相关产品推荐
相关产品推荐

