如何用Python Pandas按日期和设备统计列表类型列的唯一项数量?
使用Pandas按device和date分组统计coverage列的唯一值计数
模拟原始数据
先模拟符合需求的数据集结构:
import pandas as pd data = { 'device': ['A', 'A', 'B', 'B'], 'date': ['2023-01-01', '2023-01-01', '2023-01-02', '2023-01-02'], 'coverage': [['X', 'Y', 'X'], ['Y', 'Z'], ['X', 'X'], ['Y', 'Z', 'Z']] } df = pd.DataFrame(data)
实现步骤与代码
- 对每行的
coverage列表去重,保留唯一值 - 按
device和date分组,聚合分组内所有去重后的coverage值 - 统计每个分组内各
coverage值的出现次数 - 将统计结果整理为目标表格格式
具体代码:
# 1. 每行coverage去重 df['unique_coverage'] = df['coverage'].apply(lambda x: list(set(x))) # 2. 按device和date分组,合并所有唯一coverage值 grouped = df.groupby(['device', 'date'])['unique_coverage'].sum().reset_index() # 3. 统计分组内各coverage值的计数 grouped['coverage_counts'] = grouped['unique_coverage'].apply(lambda x: pd.Series(x).value_counts().to_dict()) # 4. 转换为目标格式的表格 result = grouped.explode('unique_coverage') result['count'] = result.apply(lambda row: row['coverage_counts'][row['unique_coverage']], axis=1) result = result.drop(columns=['unique_coverage', 'coverage_counts']).pivot(index=['device', 'date'], columns='unique_coverage', values='count').fillna(0).astype(int).reset_index() # 查看结果 print(result)
结果说明
运行代码后会得到和示例输出一致的表格:按device和date分组,每列对应一个coverage唯一值,单元格数值是该值在对应分组内的出现次数。
内容的提问来源于stack exchange,提问作者edwrand
相关产品推荐
相关产品推荐

