python - Pandas 按年分组,按销售列排名,在具有重复数据的数据框中

标签 python pandas duplicates pandas-groupby rank

我想按年份创建排名(因此在 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

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

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

有什么想法吗?
这是我正在使用的真实数据结构。 重新索引时遇到问题..

最佳答案

听起来您想按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)

产量

   Year Manager  Return  Rank
0  2012       A       3     2
1  2012       B       8     1
2  2011       A      20     2
3  2011       B      30     1

解决 OP 修改后的问题:错误信息

ValueError: cannot reindex from a duplicate axis

尝试对索引中具有重复值的 DataFrame groupby/rank 时发生。您可以通过构造 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)

产量

   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

如果您已经使用

附加了新行
s = s.append(b)

然后使用reset_index创建唯一索引:

s = s.reset_index(drop=True)

关于python - Pandas 按年分组,按销售列排名,在具有重复数据的数据框中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17604665/

相关文章:

python - 如何在Python中将列表的各个元素添加到另一个列表中?

python - 添加来自不同数据框的值

R 在一列中查找重复项并在第二列中折叠

duplicates - Cloudfront 自定义源导致重复内容问题

python - 将锯齿状数组转换为 Pandas 数据框

python - 如何使用 python-docx 将行号添加到 docx 文档部分

Python 代码可以在 Windows 中运行,但不能在 Linux 中运行

python - 在 Python 中为数据框设置每月最后一个工作日

python - 使用正则表达式和 pandas 分隔字母和数字

mysql - 如何将表中的字段粘贴到具有相同属性的另一个表中