如何在Pandas中按Doc_No分组计算Fault占count的百分比?
解决Pandas中按组计算故障百分比的问题
我猜你是想计算每组中故障(Fault=1)的数量占该组总记录数的百分比吧?毕竟直接用Fault的0/1值除以count再乘100的话,结果没什么实际意义。下面给你几种符合需求的实现方案:
方法一:分组聚合生成汇总结果
这种方法会直接生成按Doc_No分组的汇总表格,包含总数量、故障数量和对应的百分比:
import pandas as pd df = pd.DataFrame( data={'Doc_No':[10,10,20,20], 'Fault':[0,1,0,1], 'count':[41,1,24,1]} ) # 按Doc_No分组,计算每组总count和故障count grouped_stats = df.groupby('Doc_No').agg( total_count=('count', 'sum'), fault_count=('count', lambda x: x[df.loc[x.index, 'Fault'] == 1].sum()) ) # 计算故障百分比并保留两位小数(可选) grouped_stats['fault_percentage'] = (grouped_stats['fault_count'] / grouped_stats['total_count'] * 100).round(2) print(grouped_stats)
运行结果:
total_count fault_count fault_percentage Doc_No 10 42 1 2.38 20 25 1 4.00
方法二:保留原数据结构添加百分比列
如果需要保留原始DataFrame的行结构,同时给故障行添加对应百分比,可以用transform快速获取组内总数:
# 给每行添加所在组的总count df['group_total'] = df.groupby('Doc_No')['count'].transform('sum') # 仅对Fault=1的行计算百分比,其他行设为0或NaN df['fault_percentage'] = df.apply( lambda row: (row['count'] / row['group_total'] * 100).round(2) if row['Fault'] == 1 else 0, axis=1 ) print(df)
运行结果:
Doc_No Fault count group_total fault_percentage 0 10 0 41 42 0.0 1 10 1 1 42 2.38 2 20 0 24 25 0.0 3 20 1 1 25 4.00
方法三:高效的分组遍历(适合大数据量)
如果你的数据集很大,用分组遍历的方式可以避免一些复杂的lambda操作,可读性更强:
result_list = [] for doc_no, group in df.groupby('Doc_No'): total = group['count'].sum() fault_num = group[group['Fault'] == 1]['count'].sum() percentage = (fault_num / total * 100).round(2) result_list.append({'Doc_No': doc_no, 'fault_percentage': percentage}) result_df = pd.DataFrame(result_list) print(result_df)
运行结果:
Doc_No fault_percentage 0 10 2.38 1 20 4.00
你可以根据自己的需求选择合适的方法:需要汇总结果选方法一或三,需要保留原始数据结构选方法二。
内容的提问来源于stack exchange,提问作者Aru
相关产品推荐
相关产品推荐

