按工单数量累计占比从DataFrame提取记录的Python解决方案
解决代码及说明
问题分析
你之前的错误在于用nlargest时,把总和的百分比数值转成整数当行数参数传进去,这逻辑完全不对——nlargest的第一个参数是要取的行数,不是累计数值阈值,自然得不到正确结果。正确思路是先按工单数量降序排序,计算累计和,再筛选累计和达到对应百分比阈值的所有记录。
完整代码
import pandas as pd # 构造示例DataFrame(已有真实数据可替换这部分) data = { '序列号': ['abc', 'cde', 'def', 'efg', 'fgh', 'ghi'], '工单数量': [16, 15, 14, 14, 12, 10] } df = pd.DataFrame(data) # 计算工单数量总和 total_work_orders = df['工单数量'].sum() # 按工单数量降序排序,从数量最多的条目开始累计 df_sorted = df.sort_values('工单数量', ascending=False).reset_index(drop=True) # 生成累计工单数量列 df_sorted['累计工单数量'] = df_sorted['工单数量'].cumsum() # 定义25%、50%、75%对应的阈值 thresholds = [total_work_orders * p for p in [0.25, 0.5, 0.75]] # 提取累计和首次达到/超过阈值的所有记录 def get_target_records(sorted_df, threshold): first_idx = sorted_df[sorted_df['累计工单数量'] >= threshold].index[0] return sorted_df.iloc[:first_idx + 1] # 获取各阈值对应的结果 df_25 = get_target_records(df_sorted, thresholds[0]) df_50 = get_target_records(df_sorted, thresholds[1]) df_75 = get_target_records(df_sorted, thresholds[2]) # 输出结果 print("累计工单数量达到总和25%的记录:") print(df_25) print("\n累计工单数量达到总和50%的记录:") print(df_50) print("\n累计工单数量达到总和75%的记录:") print(df_75)
代码说明
- 排序:按工单数量降序排列,保证从数量最多的条目开始累计,符合常规的优先级分析逻辑。
- 累计和计算:用
cumsum()生成累计列,直观展示从第一条到当前条的工单总数。 - 阈值筛选:通过自定义函数定位累计和首次超过目标阈值的位置,提取从开头到该位置的所有记录,确保累计和刚好满足百分比要求。
内容的提问来源于stack exchange,提问作者Dhara Mandal
相关产品推荐
相关产品推荐

