Python 根据数据帧中的阈值返回前n行
这是我的输入数据框:Python 根据数据帧中的阈值返回前n行,python,pandas,dataframe,pandas-groupby,Python,Pandas,Dataframe,Pandas Groupby,这是我的输入数据框: 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]});df 需要如下输出: dfout = pd.DataFrame({'Company':['A','D','E
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]});df
需要如下输出:
dfout = pd.DataFrame({'Company':['A','D','E','F'],'Industry':['Metals','IT','IT','banking'],'ROE':[10,14,1,9],'ROCE':[10,1,10,9],'Threshold':[1,2,2,1]});dfout
逻辑:获取每个行业ROE和ROCE最高的行。N是数据帧中的“阈值”列。感谢您在这方面的投入。多谢各位 首先,按ROE/ROCE对数据进行排序:
df = df.iloc[(-np.maximum(df.ROCE, df.ROE)).argsort()]
接下来,使用groupby+apply:
或者
感谢您的意见。我意识到产出还应该包括E公司,因为我们需要将ROCE排名前2位的公司与ROE排名前2位的公司合并。因此,最终输出应包括A、C、D、E、F。请帮助微调建议的参数solution@CLS请参阅编辑,您可以对df进行预排序,然后调用此代码,我已经用您想要的输出更新了我的帖子。太好了。非常感谢。
df.groupby('Industry', group_keys=False, sort=False).apply(
lambda x: x[:x['Threshold'].unique().item()]
).sort_index()
df.groupby('Industry', group_keys=False, sort=False).apply(
lambda x: x.head(x['Threshold'].unique().item())
).sort_index()
Company Industry ROCE ROE Threshold
0 A Metals 10 10 1
3 D IT 1 14 2
4 E IT 10 1 2
5 F banking 9 9 1