Pandas groupby对象调用transform返回错误值而非预期0如何解决
问题原因
你的错误来自transform()的使用场景不匹配:
df.groupby().transform()返回的结果长度和原始df的行数完全一致,每个位置对应原行所属分组的聚合结果,会按原行的顺序重复每个分组的聚合值。- 你要赋值的
unique_cases只有4行(对应4个唯一的Test key),两边长度不匹配时pandas不会按Test key自动对齐,只会取transform返回结果的前4行直接填充,最终出现后两个测试键的累计时间被错误填充为第二个分组结果的问题。
正确实现方式
推荐直接用groupby.agg()一次性生成聚合结果,无需手动拼接列,不易出错:
cols = ['Test key', 'Elapsed Time'] tests = ['HCSSYSTEST-1676', 'HCSSYSTEST-1518', 'HCSSYSTEST-1658', 'HCSSYSTEST-1123'] filt = df_runs['Test key'].isin(tests) df_cutout = df_runs[filt][cols] # 分组聚合直接得到所有统计值 unique_cases = df_cutout.groupby('Test key', as_index=False).agg( Run_count=('Test key', 'count'), Accumulated_Time=('Elapsed Time', 'sum') ).rename(columns={'Run_count': 'Run count', 'Accumulated_Time': 'Accumulated Time'}) print(unique_cases)
如果要保留你原有的分步写法,将累计时间的赋值逻辑改为按key映射即可:
unique_cases = pd.DataFrame(df_cutout['Test key'].unique(), columns=['Test key']) unique_cases['Run count'] = unique_cases['Test key'].map(df_cutout['Test key'].value_counts()) # 先计算每个测试键的累计时长,再通过Test key映射 time_sum = df_cutout.groupby('Test key')['Elapsed Time'].sum() unique_cases['Accumulated Time'] = unique_cases['Test key'].map(time_sum)
错误表现的原因说明
你运行时后两个测试键的结果都显示为0 days 07:57:00,是因为transform返回的41行结果中,前3行都属于HCSSYSTEST-1676分组,值均为0 days 04:19:00,第4行开始属于HCSSYSTEST-1518分组,值均为0 days 07:57:00,赋值给4行的unique_cases时,刚好取前4个值,所以后两行的累计时间都取到了第二个分组的结果。
内容的提问来源于stack exchange,提问作者HackXIt
相关产品推荐
相关产品推荐

