Pandas多DataFrame合并为单列:按CUS_ID分组先DAY后TIME_HOUR
解决方案:合并Pandas分组统计结果并调整展示顺序
我明白你需要把两个不同维度的分组统计结果合并成单列,并且按「每个用户先展示时段统计,再展示星期统计」的顺序排列(和你给出的示例格式匹配)。下面是具体的实现步骤:
步骤1:预处理分组统计结果
首先,我们给两个分组结果重命名统计列,同时重置索引以便后续添加排序标识:
import pandas as pd # 模拟你的原始数据 raw_data = pd.DataFrame({ 'CUS_ID': [1176,1176,1192,1192,120,120,120,1269,1269,1269], 'TIME_ID': [2012083016,2013030418,2012091609,2012101310,2012121410,2012121915,2012121915,2012070914,2012071309,2013031414], 'TIME_HOUR': ['16h','18h','09h','10h','10h','15h','15h','14h','09h','14h'], 'DAY': ['THU','MON','SUN','SAT','FRI','WED','WED','MON','FRI','THU'] }) # 生成分组统计,给统计列命名并重置索引 df_day = raw_data.groupby(['CUS_ID','DAY']).size().rename('counts').reset_index() df_time = raw_data.groupby(['CUS_ID','TIME_HOUR']).size().rename('counts').reset_index()
步骤2:添加排序标识,控制展示顺序
我们给两类统计添加排序键,确保时段统计排在前面,星期统计排在后面:
# 排序键0:时段统计优先展示;排序键1:星期统计后续展示 df_time['sort_key'] = 0 df_day['sort_key'] = 1
步骤3:合并、排序并构建最终结果
合并两个数据集后,按用户ID、排序键排序,最后重新构建多级索引得到单列结果:
# 合并两个统计数据集 combined = pd.concat([df_time, df_day]) # 排序:先按用户ID分组,再按排序键控制展示顺序,最后按时段/星期名称排序 combined = combined.sort_values(by=['CUS_ID', 'sort_key', 'TIME_HOUR', 'DAY']) # 构建最终的多级索引Series:一级索引为用户ID,二级索引为时段/星期,值为统计数 result = combined.set_index( ['CUS_ID', combined.apply(lambda row: row['TIME_HOUR'] if row['sort_key'] == 0 else row['DAY'], axis=1)] )['counts']
查看结果示例
比如查看CUS_ID=120的统计结果:
print(result.loc[120])
输出如下:
10h 1.0 15h 2.0 FRI 1.0 WED 2.0 Name: counts, dtype: float64
这样就完全符合你的需求:每个用户下先展示所有时段的统计值,再展示所有星期的统计值,结果是无NaN值的单列Series。
内容的提问来源于stack exchange,提问作者In Kyu Choi
相关产品推荐
相关产品推荐

