如何在Pandas DataFrame中为全部分组、日期补全缺失的评分分类
实现方法
你原来的代码仅生成了group和score两个维度的笛卡尔积,只需将date维度也加入全组合生成逻辑即可,以下是两种可行实现:
方法1:笛卡尔积左关联(和你原有写法逻辑一致,易理解)
import pandas as pd import numpy as np from itertools import product # 原数据 x = pd.DataFrame(data={ 'date' : ['2020-06-01','2020-06-01','2020-06-02','2020-06-01','2020-06-02','2020-06-01','2020-06-02','2020-06-02','2020-06-02'], 'group' : ['a','a','a','b','b','c','c','c','d'], 'score' : ['high','low','mid','low','high','high','high','mid','high'], 'count' : [12,13,2,19,22,3,4,49,12] }) # 提取三个维度的所有取值 dates = x['date'].unique() groups = x['group'].unique() score_cats = ['high', 'mid', 'low'] # 生成三个维度的全组合 full_dim = pd.DataFrame( list(product(dates, groups, score_cats)), columns=['date', 'group', 'score'] ) # 左关联原表,缺失值填充0,去掉fillna则默认填充NaN result = full_dim.merge(x, how='left', on=['date', 'group', 'score']).fillna(0)
方法2:多级索引重索引(性能更优,适合大数据量场景)
# 基于原表设置三维度多级索引 x_multi = x.set_index(['date', 'group', 'score']) # 生成全组合的多级索引 full_idx = pd.MultiIndex.from_product( [x['date'].unique(), x['group'].unique(), ['high', 'mid', 'low']], names=['date', 'group', 'score'] ) # 重索引填充缺失值后恢复普通列 result = x_multi.reindex(full_idx, fill_value=0).reset_index()
两种方法输出的结果都符合预期:每个分组对应2个日期×3个评分等级共6行数据,缺失的count字段可根据需求填充0或np.nan。
内容的提问来源于stack exchange,提问作者an10b3
相关产品推荐
相关产品推荐

