使用groupby统计DataFrame分组计数,如何生成指定格式列?
解决方案
核心思路
你需要先统计每个(Release, Mapping)组合的条目数,再按Release聚合,将每个Mapping与其计数拼接成字符串列。你的原代码得到多级索引是因为groupby(['Release', 'Mapping'])后,这两列会成为结果的索引而非普通列,后续无法直接按Release合并字符串。
方法一:分步实现(清晰易懂)
先计算每个组合的计数并转为普通列,再按Release拼接:
# 第一步:统计每个(Release, Mapping)的计数,重置索引避免多级索引 count_details = df.groupby(['Release', 'Mapping'])['Coding'].count().reset_index(name='count') # 第二步:按Release分组,拼接Mapping和对应计数 final_result = count_details.groupby('Release').apply( lambda group: ', '.join([f"{row['Mapping']}:{row['count']}" for _, row in group.iterrows()]) ).reset_index(name='Mapping_Counts')
方法二:一步到位(更简洁高效)
直接在Release分组内对Mapping做频次统计并拼接,省去中间步骤:
final_result = df.groupby('Release').apply( lambda group: ', '.join([f"{mapping}:{count}" for mapping, count in group['Mapping'].value_counts().items()]) ).reset_index(name='Mapping_Counts')
方法三:自定义聚合函数(可读性更强)
如果需要更清晰的代码结构,可以封装拼接逻辑为函数:
def combine_mapping_with_count(group): # 统计当前Release下各Mapping的计数 mapping_counts = group['Mapping'].value_counts() # 拼接成指定格式的字符串 return ', '.join([f"{m}:{c}" for m, c in mapping_counts.items()]) final_result = df.groupby('Release').agg(Mapping_Counts=combine_mapping_with_count).reset_index()
原代码问题说明
你使用的df.groupby(['Release', 'Mapping'])['Coding'].agg(count='count')会生成以Release和Mapping为多级索引的DataFrame,此时无法直接对Release做进一步的字符串聚合。需要通过reset_index()将这两个索引列转为普通数据列,才能继续后续操作。
内容的提问来源于stack exchange,提问作者Anupkumar Kasi
相关产品推荐
相关产品推荐

