如何在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
相关产品推荐
相关产品推荐

