python - 分组并将行聚合到 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 循环/映射非常慢。
解决方案
试试这个
compact_df = df.groupby('ID').apply(lambda group: group.to_dict(orient='records'))
推荐阅读
- postgresql - 从 docker 容器访问主机 postgres
- python-3.x - 如何根据输入和与列表的关系从字典中打印特定元素?
- c# - 静态或非静态更适合在字符串生成器上添加变量?
- ansible - Ansible/Jinja2 嵌套转义
- electron - 在 macOS 上自动打开目录的适当权利
- android - 我们可以在默认的 tablayout 图标中设置 SVG 图像吗?
- java - 无法从 Facebook 商务管理器创建 WhatsApp 帐户
- javascript - 当按百分比设置宽度时如何检测 HTMLElement 调整大小
- amazon-web-services - 如何编写一个将文件从 aws 客户端机器上传到 s3 存储桶的 api?
- javascript - 如何在选择选项中获取 v-model 的值