如何在Pandas DataFrame中按category_id分组生成对应新列
解决方案
你需要结合image_id和category_id进行分组聚合,再将category_id转为列,具体代码如下:
方法1:聚合为集合对象
import pandas as pd # 按image_id和category_id分组,聚合chessboard_position为集合 result = df.groupby(['image_id', 'category_id'])['chessboard_position'].agg(set).unstack('category_id') # 将image_id从索引转为普通列 result = result.reset_index()
执行后得到的结果结构与你期望的一致:
| image_id | 0 | 6 | 7 | 8 | 9 |
|---|---|---|---|---|---|
| 0 | NaN | NaN | {a8} | {b8} | {c8} |
| 1 | {b4, a2} | {f7, g7, h7} | NaN | NaN | NaN |
方法2:聚合为字符串格式(与示例完全匹配)
如果需要将集合显示为{b4, a2}这样的字符串而非Python集合对象,修改聚合函数即可:
result = df.groupby(['image_id', 'category_id'])['chessboard_position'].agg(lambda x: f"{{{', '.join(x)}}}").unstack('category_id').reset_index()
原代码失效原因
你之前的代码仅按image_id分组,未关联category_id,生成的列是按数据出现顺序编号,而非对应分类ID的值。通过同时按image_id和category_id分组,先聚合同一图片、同一分类的位置,再用unstack('category_id')将分类ID转为列名,就能实现分类与列的匹配。
内容的提问来源于stack exchange,提问作者Samael
相关产品推荐
相关产品推荐

