如何在Pandas中按id聚合压缩DataFrame数据
解决方案
可以通过Pandas的groupby结合聚合逻辑实现需求,具体操作如下:
- 先构建示例DataFrame用于验证:
import pandas as pd df = pd.DataFrame({ 'id': ['a', 'a', 'a', 'e'], 'start_time': ['b', 'b', 'f', 'h'], 'channel': ['c', 'd', 'g', 'i'] })
- 分组并执行聚合:
我们需要对start_time做去重后转列表(单元素时直接返回值),对channel直接收集所有值转列表(单元素时直接返回值),可以用自定义函数或lambda表达式实现:
方式一:自定义聚合函数
def agg_unique_list(x): unique_vals = list(pd.unique(x)) return unique_vals if len(unique_vals) > 1 else unique_vals[0] def agg_plain_list(x): val_list = list(x) return val_list if len(val_list) > 1 else val_list[0] result = df.groupby('id').agg({ 'start_time': agg_unique_list, 'channel': agg_plain_list }).reset_index()
方式二:简洁lambda表达式
result = df.groupby('id').agg({ 'start_time': lambda x: list(pd.unique(x)) if len(pd.unique(x))>1 else pd.unique(x)[0], 'channel': lambda x: list(x) if len(x)>1 else x.iloc[0] }).reset_index()
执行后得到的result就是目标格式:
| id | start_time | channel |
|---|---|---|
| a | ['b', 'f'] | ['c', 'd', 'g'] |
| e | h | i |
内容的提问来源于stack exchange,提问作者Arturo Elizalde
相关产品推荐
相关产品推荐

