You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python合并两个DataFrame分组数据未达预期,求解决方案

解决方案

步骤1:将第一个DataFrame转为长格式

把df中的多列服务(Service、Service2、Service3)转换为每行一个服务的结构,保留Code关联:

import pandas as pd

data = {'Code':['xxy','zzy','rrf','ado'], 
        'Service':["23a","22c","21d","24o"],
        'Service2':["44e", "32c","85a","26f"],
        'Service3':["42e", "32z","8m","2c"],
       }
df = pd.DataFrame(data)

days = {'Services':['23a','23a','44e','zzy', "8m", "8m", "8m", "26f", "8m", "2c", "24o", "26f" ], 
        'Type days':["Monday","Tuesday","Tuesday","Wednesday", "Tuesday", "Wednesday", "Monday", "Tuesday", "Monday", "Wednesday", "Monday", "Tuesday"]
       }
df2 = pd.DataFrame(days)

# 转换为长格式,去除多余的服务类型列
df_long = df.melt(id_vars='Code', value_name='Services').drop(columns='variable')

步骤2:合并数据并统计各天出现次数

将长格式的df_long与df2按Services合并,然后分组统计每个Code下每个服务在各天的出现次数:

# 合并两个DataFrame,保留所有服务条目
merged = pd.merge(df_long, df2, on='Services', how='left')

# 分组统计,缺失的天数填充0
count_df = merged.groupby(['Code', 'Services', 'Type days']).size()\
                 .unstack(fill_value=0)\
                 .reset_index()

# 确保所有天数列存在,避免部分服务无对应天数的情况
for day in ['Monday', 'Tuesday', 'Wednesday']:
    if day not in count_df.columns:
        count_df[day] = 0

步骤3:整理为预期格式

  • 如果需要明细格式(每个服务一行):直接使用count_df,它包含每个Code下每个服务的各天计数
  • 如果需要宽格式(每个Code一行,服务+天数为列):执行以下代码合并回原DataFrame:
# 将统计结果转为宽格式,列名格式为「服务_天数」
wide_count = count_df.melt(id_vars=['Code', 'Services'], var_name='Day', value_name='Count')\
                     .pivot(index='Code', columns=['Services', 'Day'], values='Count')\
                     .fillna(0)

# 合并回原df,得到包含所有统计列的最终结果
final_df = pd.merge(df, wide_count, on='Code')

内容的提问来源于stack exchange,提问作者Thornos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 22:20:18