基于阈值从Pandas DataFrame提取各行业Top N行的技术需求
解决方案:基于阈值从Pandas DataFrame提取各行业Top N行
我来帮你搞定这个需求——按行业分组,提取ROE和ROCE综合排名前N的行,其中N由对应行业的Threshold值指定(观察输入数据,同一行业的Threshold值是统一的)。
完整代码实现
import pandas as pd # 输入原始DataFrame df = pd.DataFrame({ 'Company':['A','B','C','D','E','F'], 'Industry':['Metals','Metals','IT','IT','IT','banking'], 'ROE':[10,9,5,14,1,9], 'ROCE':[10,5,5,1,10,9], 'Threshold':[1,1,2,2,2,1] }) # 定义分组处理的自定义函数 def get_top_n(group): # 获取当前行业的阈值N(同行业阈值统一,取第一个值即可) n = group['Threshold'].iloc[0] # 计算ROE+ROCE的综合得分,按得分降序排序后取前N行 return group.assign(total_score=group['ROE'] + group['ROCE'])\ .sort_values('total_score', ascending=False)\ .head(n) # 应用分组逻辑并整理最终结果 dfout = df.groupby('Industry', group_keys=False)\ .apply(get_top_n)\ .drop('total_score', axis=1)\ .reset_index(drop=True) print(dfout)
运行结果
Company Industry ROE ROCE Threshold 0 A Metals 10 10 1 1 D IT 14 1 2 2 E IT 1 10 2 3 F banking 9 9 1
代码逻辑拆解
自定义分组函数
get_top_n:- 先获取当前行业的阈值
n:因为同一行业的Threshold值完全一致,直接取分组内第一个值就可以。 - 临时计算综合得分:添加
total_score列,把ROE和ROCE的数值相加作为排名依据(如果你的需求是按单个指标排名,比如只看ROE,直接把排序依据改成ROE就行)。 - 排序取Top N:按综合得分降序排列后,提取前
n行。
- 先获取当前行业的阈值
分组应用与结果整理:
- 用
groupby('Industry')按行业拆分数据,group_keys=False避免分组键被自动添加到结果索引里。 - 通过
apply把自定义函数套用到每个行业分组上。 - 最后删掉临时的
total_score列,重置索引得到干净的输出DataFrame。
- 用
内容的提问来源于stack exchange,提问作者CLS
相关产品推荐
相关产品推荐

