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

如何在Python Pandas中按值排序选取行至总值的30%

解决方案:按Value排序后选取行至累计和达总值30%

核心思路

先对DataFrame按Value列排序,再计算排序后Value的累计和,筛选出累计和不超过总值30%的行;若排序后首个值已超过阈值,可调整逻辑选取最接近的行。

基础实现(累计和不超过阈值)

假设你需要优先选取数值大的行(降序排序),代码如下:

# 链式写法
out = df.sort_values('Value', ascending=False).loc[lambda d: d['Value'].cumsum().le(df['Value'].sum() * 0.3)]

# 分步写法更易理解
# 1. 按Value降序排序
sorted_df = df.sort_values('Value', ascending=False)
# 2. 计算总值的30%作为阈值
threshold = df['Value'].sum() * 0.3
# 3. 筛选累计和<=阈值的行
out = sorted_df.loc[sorted_df['Value'].cumsum().le(threshold)]

如果需要从小到大选取行,只需将sort_values中的ascending=False改为ascending=True。

边界情况处理(首个值即超过阈值)

以你的数据为例,总值为81,30%阈值是24.3,降序排序后首个值43已超过阈值,上述代码会返回空DataFrame。若需要选取最接近阈值的行(即使超过),可使用以下代码:

sorted_df = df.sort_values('Value', ascending=False)
threshold = df['Value'].sum() * 0.3
cum_sum = sorted_df['Value'].cumsum()
# 找到第一个累计和超过阈值的位置,取到该行
idx = cum_sum.gt(threshold).idxmax()
out = sorted_df.loc[:idx]

这段代码会返回ID=999, Value=43的行,是最接近阈值的单行结果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 21:30:40