Python Pandas:基于跨行比较筛选DataFrame中多组关联行
解决方案
步骤说明
要实现需求,需分阶段筛选:先锁定每个ID的最新日期,再在该日期范围内选出成功数最高的测试,最后保留对应所有行记录。
完整代码
import pandas as pd # 初始化输入数据 input_df = pd.DataFrame({ 'ID': ["A", 'A', 'A', 'B', 'B', 'B','C'], 'Test': ["e2z", 'e2z', 'b6r', 'p0o', 'r5t', 'qi4','x3w'], 'Date': ["2022", '2022', '2020', '2019', '2019', '2018', '2023'], 'Success': ['1', '0', '1', '0', '1', '0','0'], 'Experiment Parameters': ["awa", '02s', 'ksa', 'fkd', 'efe', 'awe','loa'] }) # 1. 转换Date和Success为数值类型,避免字符串比较误差,方便计算成功数总和 input_df['Date'] = input_df['Date'].astype(int) input_df['Success'] = input_df['Success'].astype(int) # 2. 按ID分组,获取每个ID的最新日期 id_max_date = input_df.groupby('ID')['Date'].max().reset_index() id_max_date.columns = ['ID', 'Max_Date'] # 3. 筛选出每个ID中日期等于最新日期的行 filtered_by_date = input_df.merge(id_max_date, on='ID') filtered_by_date = filtered_by_date[filtered_by_date['Date'] == filtered_by_date['Max_Date']] # 4. 按ID和Test分组,计算每个测试的总成功数 test_success_sum = filtered_by_date.groupby(['ID', 'Test'])['Success'].sum().reset_index() test_success_sum.columns = ['ID', 'Test', 'Total_Success'] # 5. 按ID分组,选出每个ID下总成功数最高的测试 id_best_test = test_success_sum.groupby('ID').apply( lambda x: x[x['Total_Success'] == x['Total_Success'].max()] ).reset_index(drop=True) # 6. 从原表中筛选出符合条件的所有行 result = input_df.merge(id_best_test[['ID', 'Test']], on=['ID', 'Test']) # 恢复字段为原数据的字符串格式(可选) result['Success'] = result['Success'].astype(str) result['Date'] = result['Date'].astype(str) print(result)
代码解释
- 类型转换:将
Date和Success转为数值型,解决字符串比较的逻辑错误,同时保证成功数求和的准确性。 - 筛选最新日期:通过分组聚合得到每个ID的最大日期,再合并回原表筛选出对应行,缩小候选范围。
- 计算测试成功数:在最新日期范围内,按ID+Test分组统计总成功数,定位每个ID下的最优测试。
- 最终筛选:通过合并最优测试的ID和Test标识,从原表提取所有对应行,完整保留
Experiment Parameters等原始字段。
输出结果
ID Test Date Success Experiment Parameters 0 A e2z 2022 1 awa 1 A e2z 2022 0 02s 2 B r5t 2019 1 efe 3 C x3w 2023 0 loa
内容的提问来源于stack exchange,提问作者hqp
相关产品推荐
相关产品推荐

