关于PandasDataFrame的ranking问题

[复制链接]
查看11 | 回复7 | 2021-1-29 05:08:21 | 显示全部楼层 |阅读模式
假设某DataFrame有两列df=pd.DataFrame({'a':[1,1,2,3,3,4,4,4],'b':[0,1,3,1,1,2,2,1]})如何生成一列df['Rank'],先按df['a']降序排列,再按df['b']降序排列,如果有两行相同的话取相同的rank?不知道表述没表述清。类似于df.sort_values(['a','b'],ascending=False)再加上df.rank(method='min',ascending='False').astype(int)……比如上面df的rank为[8,7,6,4,4,1,1,3]
回复

使用道具 举报

千问 | 2021-1-29 05:08:21 | 显示全部楼层
huayuankou (猪芳芳) 在 ta 的帖子中提到:假设某DataFrame有两列df=pd.DataFrame({'a':[1,1,2,3,3,4,4,4],'b':[0,1,3,1,1,2,2,1]})如何生成一列df['Rank'],先按df['a']降序排列,再按df['b']降序排列,如果有两行相同的话取相同的rank?……
随手搜到了个numpy/scipy的@@:https://stackoverflow.com/questions/39059371/。

回复

使用道具 举报

千问 | 2021-1-29 05:08:21 | 显示全部楼层
这个好像针对的是单列……Casper (311.5:Esistvollbracht!) 在 ta 的帖子中提到:
随手搜到了个numpy/scipy的@@:https://stackoverflow.com/questions/39059371/。
回复

使用道具 举报

千问 | 2021-1-29 05:08:21 | 显示全部楼层
蠢方法,假设都是正实数,可以新开一列数组:df[c]=(min(df[a])+df[a])*(abs(max(df))+1)+df
df[c].rank(ascending=False, method=min).astype(int)
基本思路就是建造一个abs(max(df))+1进制的数,把df[a]弄到高进制位去,保留df在低进制位,然后rank它。没测试负数情况,考虑可能不周全。
huayuankou (猪芳芳) 在 ta 的帖子中提到:假设某DataFrame有两列df=pd.DataFrame({'a':[1,1,2,3,3,4,4,4],'b':[0,1,3,1,1,2,2,1]})如何生成一列df['Rank'],先按df['a']降序排列,再按df['b']降序排列,如果有两行相同的话取相同的rank?……
回复

使用道具 举报

千问 | 2021-1-29 05:08:21 | 显示全部楼层
理论上我理解了,我暂时也不用负数情况。万分感谢!doctor (老博士) 在 ta 的帖子中提到:蠢方法,假设都是正实数,可以新开一列数组:[代码]基本思路就是建造一个abs(max(df))+1进制的数,把df[a]弄到高进制位去,保留df在低进制位,然后rank它。……
回复

使用道具 举报

千问 | 2021-1-29 05:08:21 | 显示全部楼层
tqldoctor (老博士) 在 ta 的帖子中提到:蠢方法,假设都是正实数,可以新开一列数组:[代码]基本思路就是建造一个abs(max(df))+1进制的数,把df[a]弄到高进制位去,保留df在低进制位,然后rank它。……
回复

使用道具 举报

千问 | 2021-1-29 05:08:21 | 显示全部楼层
df['rank']=df[['a','b']].apply(tuple,axis=1).rank(ascending=False,method='min')
把ab组成一个tuple就可以了huayuankou (猪芳芳) 在 ta 的帖子中提到:假设某DataFrame有两列df=pd.DataFrame({'a':[1,1,2,3,3,4,4,4],'b':[0,1,3,1,1,2,2,1]})如何生成一列df['Rank'],先按df['a']降序排列,再按df['b']降序排列,如果有两行相同的话取相同的rank?……
回复

使用道具 举报

千问 | 2021-1-29 05:08:21 | 显示全部楼层
谢谢,我研习一下!mintcandy (豆瓣Mintcandy) 在 ta 的帖子中提到:df['rank']=df[['a','b']].apply(tuple,axis=1).rank(ascending=False,method='min')
把ab组成一个tuple就可以了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行