使用pandas按另一列的值对列进行排序。

7

我有一个数据集,希望对其进行排序并根据排序结果赋予排名。

假设该数据集有两列,一列是年份,另一列是我想要排序的列。

import pandas as pd
data = {'year': pd.Series([2006, 2006, 2007, 2007]), 
        'value': pd.Series([5, 10, 4, 1])}
df = pd.DataFrame(data)

我希望能按照每年对'值'列进行排序,并对其进行排名。我的期望是:
data2= {'year': pd.Series([2006, 2006, 2007, 2007]), 
        'value': pd.Series([10, 5, 4, 1]),  
        'rank': pd.Series([1, 2, 1, 2]}
df2=pd.DataFrame(data2)

>>> df2
   rank  value  year
0     1     10  2006
1     2      5  2006
2     1      4  2007
3     2      1  2007
2个回答

12
您可以使用groupby,然后使用rank(使用ascending=False以先获取最大值)。您不需要在groupby中进行排序,因为结果已经索引到数据帧中(性能稍快)。
df['yearly_rank'] = df.groupby('year', sort=False)['value'].rank(ascending=False)

>>> df.sort_values(['year', 'yearly_rank'])
   value  year  yearly_rank
1     10  2006            1
0      5  2006            2
2      4  2007            1
3      1  2007            2

3
你真的需要使用 transform 吗?使用 df.groupby('year')['value'].rank() 不会达到同样的效果吗? - itzy
是的,那更简单。 - Alexander
哇,这正是我一直在寻找的。非常感谢你们两个! - John Shin
好的。有没有一种方法可以按照另一个具有空值的值对值进行排序?我已经尝试了4种方法,但都不起作用。 - karthikeyan

0

考虑一个带有排序的分组应用函数:

def rankfct(row):    
    row['rank'] = row['value'].rank(ascending=False)    
    return row

df = df.groupby(['year']).apply(rankfct).sort(['year','value'], ascending=[1,0])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接