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
相关产品推荐
相关产品推荐

