如何通过按两列过滤来获得列的排名?
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
部分确保较高的值获得更好(较低)的排名。
我有下面的数据框。我想创建一个名为 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
部分确保较高的值获得更好(较低)的排名。