You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

按工单数量累计占比从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)

代码说明

  1. 排序:按工单数量降序排列,保证从数量最多的条目开始累计,符合常规的优先级分析逻辑。
  2. 累计和计算:用cumsum()生成累计列,直观展示从第一条到当前条的工单总数。
  3. 阈值筛选:通过自定义函数定位累计和首次超过目标阈值的位置,提取从开头到该位置的所有记录,确保累计和刚好满足百分比要求。

内容的提问来源于stack exchange,提问作者Dhara Mandal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 02:45:23