pandas group by year,按销售列排名,在具有重复数据的数据框中

Ben*_*Ben 16 python duplicates rank pandas pandas-groupby

我想创建一年的排名(因此在2012年,经理B为1. 2011年,经理B再次为1).我和pandas rank函数挣扎了一段时间,并且不想求助于for循环.

s = pd.DataFrame([['2012','A',3],['2012','B',8],['2011','A',20],['2011','B',30]], columns=['Year','Manager','Return'])

Out[1]:     
   Year Manager  Return    
0  2012       A       3    
1  2012       B       8    
2  2011       A      20    
3  2011       B      30
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是附加代码(之前认为这不相关):

s = pd.DataFrame([['2012', 'A', 3], ['2012', 'B', 8], ['2011', 'A', 20], ['2011', 'B', 30]], columns=['Year', 'Manager', 'Return'])
b = pd.DataFrame([['2012', 'A', 3], ['2012', 'B', 8], ['2011', 'A', 20], ['2011', 'B', 30]], columns=['Year', 'Manager', 'Return'])

s = s.append(b)
s['Rank'] = s.groupby(['Year'])['Return'].rank(ascending=False)

raise Exception('Reindexing only valid with uniquely valued Index '
Exception: Reindexing only valid with uniquely valued Index objects
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?
这是我正在使用的真实数据结构.一直无法重新编制索引..

unu*_*tbu 25

听起来你想要按照分组Year,然后Returns按降序排列.

import pandas as pd
s = pd.DataFrame([['2012', 'A', 3], ['2012', 'B', 8], ['2011', 'A', 20], ['2011', 'B', 30]],
                 columns=['Year', 'Manager', 'Return'])
s['Rank'] = s.groupby(['Year'])['Return'].rank(ascending=False)
print(s)
Run Code Online (Sandbox Code Playgroud)

产量

   Year Manager  Return  Rank
0  2012       A       3     2
1  2012       B       8     1
2  2011       A      20     2
3  2011       B      30     1
Run Code Online (Sandbox Code Playgroud)

解决OP的修订问题:错误消息

ValueError: cannot reindex from a duplicate axis
Run Code Online (Sandbox Code Playgroud)

尝试groupby/rank在索引中具有重复值的DataFrame 时发生.您可以通过s在追加后构造具有唯一索引值来避免此问题:

s = pd.DataFrame([['2012', 'A', 3], ['2012', 'B', 8], ['2011', 'A', 20], ['2011', 'B', 30]], columns=['Year', 'Manager', 'Return'])
b = pd.DataFrame([['2012', 'A', 3], ['2012', 'B', 8], ['2011', 'A', 20], ['2011', 'B', 30]], columns=['Year', 'Manager', 'Return'])
s = s.append(b, ignore_index=True)
Run Code Online (Sandbox Code Playgroud)

产量

   Year Manager  Return
0  2012       A       3
1  2012       B       8
2  2011       A      20
3  2011       B      30
4  2012       A       3
5  2012       B       8
6  2011       A      20
7  2011       B      30
Run Code Online (Sandbox Code Playgroud)

如果您已使用添加新行

s = s.append(b)
Run Code Online (Sandbox Code Playgroud)

然后reset_index用来创建一个唯一的索引:

s = s.reset_index(drop=True)
Run Code Online (Sandbox Code Playgroud)