我有一个数据集,我想根据它排序和分配排名。
假设它有两列,一列是年份,另一列是我要排序的列。
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
答案 0 :(得分:9)
您可以使用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
答案 1 :(得分:0)
考虑groupby apply函数sort:
def rankfct(row):
row['rank'] = row['value'].rank(ascending=False)
return row
df = df.groupby(['year']).apply(rankfct).sort(['year','value'], ascending=[1,0])