首页 > 解决方案 > 分组并将行聚合到 Pandas 中的系列或字典列表中

问题描述

我有一个包含 700 万行的数据框,看起来像这样

|    | ID     | VAL1 | VAL2
|---:|:-------|:-----|:----
|  0 | QWERTY | 1    | ABC
|  1 | 123456 | 2    | ABC
|  2 | QWERTY | 3    | ABC
|  3 | QWERTY | 4    | ABC
|  4 | 123456 | 5    | ABC
df = pd.DataFrame(
    columns=("ID", "VAL1", "VAl2"),
    data=[("QWERTY", 1, "ABC"), ("123456", 2, "ABC"), ("QWERTY", 3, "ABC"), ("QWERTY", 4, "ABC"), ("123456", 5, "ABC")]
)

我想按 ID 对其进行分组或将其转换为这样的形状

|    | ID     | GROUPED
|---:|:-------|:------------------------------------------------
|  0 | QWERTY | [{'ID': 'QWERTY', 'VAL1': 1, 'VAl2': 'ABC'}, {'ID': 'QWERTY', 'VAL1': 3, 'VAl2': 'ABC'}, {'ID': 'QWERTY', 'VAL1': 4, 'VAl2': 'ABC'}, ]
|  1 | 123456 | [{'ID': '123456', 'VAL1': 2, 'VAl2': 'ABC'}, {'ID': '123456', 'VAL1': 5, 'VAl2': 'ABC'}]

它应该按 ID 分组,并有一个包含与该 ID 对应的整行的列表。列表中的行可以是 Series 或 Dict。


我试图以这种方式做到这一点

test1 = df.groupby("ID").apply(lambda x: df.iloc[list(x.to_dict()["VAL1"].keys())])

但它会扩展行并创建多索引,而不是列表或其他东西

              ID  VAL1 VAl2
ID
123456 1  123456     2  ABC
       4  123456     5  ABC
QWERTY 0  QWERTY     1  ABC
       2  QWERTY     3  ABC
       3  QWERTY     4  ABC

有什么办法可以用熊猫做吗?
不幸的是,当操作 500 万行时,普通的 python 循环/映射非常慢。

标签: pythonpandasdataframe

解决方案


试试这个

compact_df =  df.groupby('ID').apply(lambda group: group.to_dict(orient='records'))

推荐阅读