如何为DataFrame按NAME分组生成TEST列的频次统计新列?
解决方案
要实现按NAME统计TEST各值的出现次数并生成RESUME列,你可以通过分组统计+合并去重的方式完成,具体步骤如下:
1. 统计每个NAME的TEST值频次
使用groupby结合value_counts统计频次,再将结果整理为字典格式(方便后续转换为目标样式):
counts = df.groupby('NAME')['TEST'].value_counts().unstack(fill_value=0).apply(lambda x: x[x>0].to_dict(), axis=1)
2. 合并结果并去重
将统计结果合并回原DataFrame,再按NAME去重,保留每个NAME的唯一行:
# 合并统计结果到原数据 df = df.merge(counts.rename('RESUME'), on='NAME') # 按NAME去重,保留每个NAME的第一条记录 result = df.drop_duplicates(subset='NAME').reset_index(drop=True) # 将字典格式转为你需要的列表字符串样式 result['RESUME'] = result['RESUME'].apply(lambda d: [f"{k}: {v}" for k, v in d.items()])
完整可运行代码
import pandas as pd # 原始DataFrame data = { 'NAME': ['Homer Simpson', 'Homer Simpson', 'Homer Simpson', 'Marge Simpson', 'Marge Simpson', 'Lisa Simpson', 'Bart Simpson', 'Maggie Simpson'], 'TEST': ['PASSED', 'FAILED', 'FAILED', 'PASSED', 'PASSED', 'PASSED', 'FAILED', 'FAILED'] } df = pd.DataFrame(data) # 执行统计与格式转换 counts = df.groupby('NAME')['TEST'].value_counts().unstack(fill_value=0).apply(lambda x: x[x>0].to_dict(), axis=1) df = df.merge(counts.rename('RESUME'), on='NAME') result = df.drop_duplicates(subset='NAME').reset_index(drop=True) result['RESUME'] = result['RESUME'].apply(lambda d: [f"{k}: {v}" for k, v in d.items()]) print(result)
输出结果
NAME TEST RESUME 0 Homer Simpson PASSED [PASSED: 1, FAILED: 2] 1 Marge Simpson PASSED [PASSED: 2] 2 Lisa Simpson PASSED [PASSED: 1] 3 Bart Simpson FAILED [FAILED: 1] 4 Maggie Simpson FAILED [FAILED: 1]
内容的提问来源于stack exchange,提问作者Ainulindalë
相关产品推荐
相关产品推荐

