【问题标题】:pandas group by year, rank by sales column, in a dataframe with duplicate dataPandas 按年份分组,按销售列排名,在具有重复数据的数据框中
【发布时间】:2013-07-10 09:23:19
【问题描述】:

我想创建一个年度排名(所以在 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

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

【问题讨论】:

  • 你到底为什么要做s= s.append(b),附加一个具有相同索引的副本?这只会产生问题。 (正如@unutbu 所说,append(..., ignore_index=False) 修复了它)。但是复制数据框行的需要是什么?

标签: python pandas duplicates pandas-groupby rank


【解决方案1】:

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

【讨论】:

  • 我遇到的问题是附加代码(之前不认为这是相关的):
猜你喜欢
  • 2021-06-23
  • 1970-01-01
  • 2020-03-21
  • 2018-08-23
  • 1970-01-01
  • 2019-03-20
  • 2021-09-12
  • 2017-11-04
  • 2021-06-06
相关资源
最近更新 更多