如何通过按两列过滤来获得列的排名?

How to get rank of a column by filtering by two columns?

我有下面的数据框。我想创建一个名为 rank 的新列,按每年和行业的增长对股票进行排名。

import pandas as pd
d = {'date': [2000, 2000, 2001, 2001, 2002, 2002, 2003, 2003, 2004, 2004],  'Stock': ["GM", "F", "GM", "F", "GM", "F", "GM", "F", "GM", "F"], 'US Sales Growth': [.3, .3, .1, .1, .6, .6, .12, .12, .7, .7], 'Stock_Growth': [.1, .2, .3, .4, .14, .16,  .2, .1,.15,.16]}
df = pd.DataFrame(data=d)

它应该是这样的。

d = {'date': [2000, 2000, 2001, 2001, 2002, 2002, 2003, 2003, 2004, 2004],  'Stock': ["GM", "F", "GM", "F", "GM", "F", "GM", "F", "GM", "F"], 'Sector': ['Auto', 'Auto', 'Auto', 'Auto', 'Auto', 'Auto', 'Auto', 'Auto', 'Auto', 'Auto'],  'US Sales Growth': [.3, .3, .1, .1, .6, .6, .12, .12, .7, .7], 'Stock_Growth': [.1, .2, .3, .4, .14, .16,  .2, .1,.15,.16], 'Rank': [2, 1, 2, 1, 2, 1, 1, 2, 2, 1]}

df2 = pd.DataFrame(data=d) 

我试过这样做,但只给了我 NAN

df['place_holder'] = df.groupby(['Stock','date'], as_index=False)['Stock_Growth'].transform(lambda x: x.shift(1))
df['rank']  = df.groupby('date', as_index=False)['place_holder'].transform(lambda x: x.rank())

另一种方法是先按日期分组,然后按扇区分组,然后对它们进行排名。

使用 groupby 然后应用另一个步骤对每个组进行排名似乎是正确的方法。我建议使用 Groupby 对象的 rank 方法来计算每个组中列值的排名。这意味着,这应该提供预期的输出:

>> df["Rank"] = df.groupby(["date", "Sector"])["Stock_Growth"].rank(ascending=False)
>> df
   date Stock  US Sales Growth  Stock_Growth Sector  Rank
0  2000    GM             0.30          0.10   Auto   2.0
1  2000     F             0.30          0.20   Auto   1.0
2  2001    GM             0.10          0.30   Auto   2.0
3  2001     F             0.10          0.40   Auto   1.0
4  2002    GM             0.60          0.14   Auto   2.0
5  2002     F             0.60          0.16   Auto   1.0
6  2003    GM             0.12          0.20   Auto   1.0
7  2003     F             0.12          0.10   Auto   2.0
8  2004    GM             0.70          0.15   Auto   2.0
9  2004     F             0.70          0.16   Auto   1.0

ascending=False 部分确保较高的值获得更好(较低)的排名。