如何使用groupby按id和type分组,将text列值合并为列表?
使用groupby合并同类型行并将text转为列表
原始表格
| id | type | text |
|---|---|---|
| 1 | inv_num | 123 |
| 1 | company | ASD |
| 1 | item | fruit |
| 1 | item | vegetable |
| 2 | inv_num | 123 |
| 2 | company | FOO |
| 2 | item | computer |
| 2 | item | mouse |
| 2 | item | headphones |
目标表格
| id | type | text |
|---|---|---|
| 1 | inv_num | 123 |
| 1 | company | ASD |
| 1 | item | ['fruit', 'vegetable'] |
| 2 | inv_num | 123 |
| 2 | company | FOO |
| 2 | item | ['computer', 'mouse', 'headphones'] |
解答
完全可以用groupby实现该需求,以下是基于Python pandas的实现方案:
代码示例
import pandas as pd # 构造原始数据 data = [ [1, 'inv_num', '123'], [1, 'company', 'ASD'], [1, 'item', 'fruit'], [1, 'item', 'vegetable'], [2, 'inv_num', '123'], [2, 'company', 'FOO'], [2, 'item', 'computer'], [2, 'item', 'mouse'], [2, 'item', 'headphones'] ] df = pd.DataFrame(data, columns=['id', 'type', 'text']) # 按id和type分组,聚合text为列表 result_df = df.groupby(['id', 'type'])['text'].agg(list).reset_index() # 可选:将单元素列表转为原始值,匹配目标表格格式 result_df['text'] = result_df['text'].apply(lambda x: x[0] if len(x) == 1 else x) print(result_df)
代码说明
groupby(['id', 'type']):按id和type的组合进行分组,保证同一id下的同类型数据被归为一组agg(list):将每组的text字段值聚合为列表reset_index():将分组后的索引转换为普通列,恢复表格结构- 最后的lambda处理是可选操作,目的是让仅单个元素的列表还原为原始值,和目标表格的格式完全一致
内容的提问来源于stack exchange,提问作者Yana
相关产品推荐
相关产品推荐

