如何在Pandas DataFrame中自动筛选占总百分比最高的前N行数据
解决方法
核心思路是先计算降序排列后的累计百分比,再通过自定义的累计占比阈值自动匹配需要截取的行数。
完整实现代码
import pandas as pd import numpy as np # 1. 构造原始数据 df = pd.DataFrame({ 'name':['Sara', 'John', 'Christine','Paul', 'Jo', 'Zack','Chris', 'Mathew', 'Suzan'], 'visits': [0, 0, 1,2, 3, 9,6, 10, 3] }) # 2. 计算单条数据占比 df['percent'] = df['visits'] / np.sum(df['visits']) # 3. 按占比降序排序并重置索引 df_sorted = df.sort_values(by='percent', ascending=False).reset_index(drop=True) # 4. 计算累计占比 df_sorted['cum_percent'] = df_sorted['percent'].cumsum() # 5. 自定义累计占比阈值,比如要求总和至少达到70% threshold = 0.7 # 6. 自动计算需要截取的行数N # 写法1:保留到刚好让累计占比≥阈值的行,保证总占比达标 n = df_sorted[df_sorted['cum_percent'] >= threshold].index[0] + 1 # 写法2:保留累计占比≤阈值的最大行数,保证总占比不超过阈值 # n = df_sorted[df_sorted['cum_percent'] <= threshold].index[-1] + 1 # 7. 筛选最终结果 result = df_sorted.head(n)
运行示例结果
使用你提供的示例数据、阈值设为0.7时,自动计算得到n=3,输出结果如下:
| name | visits | percent | cum_percent | |
|---|---|---|---|---|
| 0 | Mathew | 10 | 0.294118 | 0.294118 |
| 1 | Zack | 9 | 0.264706 | 0.558824 |
| 2 | Chris | 6 | 0.176471 | 0.735294 |
你可以根据业务需求灵活调整threshold的数值,无论数据波动多大,都会自动匹配对应的截取行数。如果需要过滤掉占比为0的无效数据,在排序前添加df = df[df['percent'] > 0]即可。
内容的提问来源于stack exchange,提问作者MTALY
相关产品推荐
相关产品推荐

