如何用Pandas idxmax获取Top N值?解决apply方法报错问题
问题解答
一、能否用idxmax获取Top N结果?
idxmax仅能返回每行/列单个最大值对应的索引,无法直接获取Top N的结果。如果非要用idxmax模拟实现Top N,需要多次调用并临时屏蔽已选中的最大值(比如将对应位置设为NaN),但这种方法繁琐且会修改数据,远不如直接使用nlargest高效简洁,不推荐。
二、解决apply方法的报错
报错原因
df.apply()方法本身没有numeric_only这个参数,该参数是idxmax、sum等聚合类方法的专属参数,传入后会触发TypeError。
修正方案
- 先筛选数值型列:如果DataFrame中存在非数值列(比如你添加的
Max列是字符串类型),先通过select_dtypes筛选出数值列,避免后续abs()、nlargest()方法报错; - 移除apply中的
numeric_only参数。
修正后的代码
import pandas as pd df = pd.DataFrame({'consumption': [10.51, 103.11, 55.48], 'co2_emissions': [37.2, 19.66, 1712]}, index=['Pork', 'Wheat Products', 'Beef']) df['Max'] = df.idxmax(axis=1, skipna=True, numeric_only=True) # 筛选数值型列 numeric_df = df.select_dtypes(include='number') # 获取每行前2大值的索引列表 df['Top2'] = numeric_df.apply(lambda s: s.abs().nlargest(2).index.tolist(), axis=1) print(df)
输出结果
consumption co2_emissions Max Top2 Pork 10.51 37.20 co2_emissions [co2_emissions, consumption] Wheat Products 103.11 19.66 consumption [consumption, co2_emissions] Beef 55.48 1712.00 co2_emissions [co2_emissions, consumption]
内容的提问来源于stack exchange,提问作者prashanth manohar
相关产品推荐
相关产品推荐

