基于Pandas实现测试用例去重并统计每日失败测试次数
问题描述
我正在处理一个分组后的Pandas数据集,结构如下:
test_identifier timestamp Count_of_Fail_tests test_status test1 22-08-2022 07:00 0 pass 23-08-2022 07:00 0 pass 24-08-2022 07:00 0 pass 25-08-2022 07:00 0 pass 26-08-2022 07:00 0 pass test10 22-08-2022 07:00 0 pass 23-08-2022 07:00 0 pass 24-08-2022 07:00 0 pass 25-08-2022 07:00 0 pass 26-08-2022 07:00 0 pass test2 22-08-2022 07:00 2 fail 23-08-2022 07:00 2 pass 24-08-2022 07:00 2 pass 25-08-2022 07:00 2 fail 26-08-2022 07:00 2 pass test3 22-08-2022 07:00 0 pass 23-08-2022 07:00 0 pass 24-08-2022 07:00 0 pass 25-08-2022 07:00 0 pass 26-08-2022 07:00 0 pass test4 22-08-2022 07:00 1 pass 23-08-2022 07:00 1 pass 24-08-2022 07:00 1 pass 25-08-2022 07:00 1 pass 26-08-2022 07:00 1 fail
希望对Count_of_Fail_tests列进行去重处理,得到如下输出(移除test_status列也可):
test_identifier timestamp Count_of_Fail_tests test_status test1 22-08-2022 07:00 0 pass 23-08-2022 07:00 pass 24-08-2022 07:00 pass 25-08-2022 07:00 pass 26-08-2022 07:00 pass test10 22-08-2022 07:00 pass 23-08-2022 07:00 pass 24-08-2022 07:00 pass 25-08-2022 07:00 pass 26-08-2022 07:00 pass test2 22-08-2022 07:00 2 fail 23-08-2022 07:00 pass 24-08-2022 07:00 pass 25-08-2022 07:00 fail 26-08-2022 07:00 pass test3 22-08-2022 07:00 0 pass 23-08-2022 07:00 pass 24-08-2022 07:00 pass 25-08-2022 07:00 pass 26-08-2022 07:00 pass test4 22-08-2022 07:00 pass 23-08-2022 07:00 pass 24-08-2022 07:00 pass 25-08-2022 07:00 pass 26-08-2022 07:00 1 fail
核心目标是统计每个测试用例每日的失败运行次数,原始DataFrame结构如下:
timestamp test_identifier test_status 0 22-08-2022 07:00 test1 pass 1 22-08-2022 07:00 test2 fail 2 22-08-2022 07:00 test3 pass 3 22-08-2022 07:00 test4 pass 4 22-08-2022 07:00 test5 pass 5 22-08-2022 07:00 test6 pass 6 22-08-2022 07:00 test7 fail 7 22-08-2022 07:00 test8 pass 8 22-08-2022 07:00 test9 pass 9 22-08-2022 07:00 test10 pass 10 23-08-2022 07:00 test1 pass 11 23-08-2022 07:00 test2 pass 12 23-08-2022 07:00 test3 pass 13 23-08-2022 07:00 test4 pass 14 23-08-2022 07:00 test5 fail 15 23-08-2022 07:00 test6 pass 16 23-08-2022 07:00 test7 pass 17 23-08-2022 07:00 test8 pass 18 23-08-2022 07:00 test9 pass 19 23-08-2022 07:00 test10 pass 20 24-08-2022 07:00 test1 pass 21 24-08-2022 07:00 test2 pass 22 24-08-2022 07:00 test3 pass 23 24-08-2022 07:00 test4 pass 24 24-08-2022 07:00 test5 pass 25 24-08-2022 07:00 test6 pass 26 24-08-2022 07:00 test7 pass 27 24-08-2022 07:00 test8 pass 28 24-08-2022 07:00 test9 pass 29 24-08-2022 07:00 test10 pass 30 25-08-2022 07:00 test1 pass 31 25-08-2022 07:00 test2 fail 32 25-08-2022 07:00 test3 pass 33 25-08-2022 07:00 test4 pass 34 25-08-2022 07:00 test5 pass 35 25-08-2022 07:00 test6 pass 36 25-08-2022 07:00 test7 fail 37 25-08-2022 07:00 test8 pass 38 25-08-2022 07:00 test9 pass 39 25-08-2022 07:00 test10 pass 40 26-08-2022 07:00 test1 pass 41 26-08-2022 07:00 test2 pass 42 26-08-2022 07:00 test3 pass 43 26-08-2022 07:00 test4 fail 44 26-08-2022 07:00 test5 pass 45 26-08-2022 07:00 test6 pass 46 26-08-2022 07:00 test7 pass 47 26-08-2022 07:00 test8 pass 48 26-08-2022 07:00 test9 pass 49 26-08-2022 07:00 test10 pass
解决方案
方式1:从原始数据直接统计(推荐)
直接基于原始DataFrame分组统计每日失败次数,比修改已分组数据集更高效准确:
import pandas as pd # 生成失败标记列:1代表fail,0代表pass df['Count_of_Fail_tests'] = df['test_status'].map({'fail': 1, 'pass': 0}) # 按测试用例+日期分组,求和得到每日失败次数 daily_fail = df.groupby(['test_identifier', 'timestamp'], as_index=False)['Count_of_Fail_tests'].sum() # 若需保留test_status列,合并回原数据 result = pd.merge(daily_fail, df[['test_identifier', 'timestamp', 'test_status']], on=['test_identifier', 'timestamp'])
方式2:在已分组数据集上实现去重显示
如果需要在现有分组数据集中,让Count_of_Fail_tests仅在测试失败的行显示(其余行留空),可以这样处理:
# 先重置多级索引为普通列 grouped_df = grouped_df.reset_index() # 仅保留test_status为fail的行的Count值,其余设为空 grouped_df['Count_of_Fail_tests'] = grouped_df.apply( lambda row: row['Count_of_Fail_tests'] if row['test_status'] == 'fail' else '', axis=1 ) # 恢复原分组索引格式 grouped_df = grouped_df.set_index('test_identifier')
效果说明
- 方式1能准确统计每个测试用例每日的失败次数,数据逻辑更严谨
- 方式2可直接匹配你想要的输出格式,让Count值仅在失败行显示
内容的提问来源于stack exchange,提问作者newuser
相关产品推荐
相关产品推荐

