如何为具有多个数字列的给定 pandas 数据框创建排名 table?
How do I create a rank table for a given pandas dataframe with multiple numerical columns?
我想创建一个基于多列 pandas 数据框的排名 table,其中包含多个数字列。
我们以下面的df为例:
Name
Sales
Volume
Reviews
A
1000
100
100
B
2000
200
50
C
5400
500
10
我想创建一个新的 table、ranked_df,它按降序排列每列中的值,同时保持基本相同的格式:
Name
Sales_rank
Volume_rank
Reviews_rank
A
3
3
1
B
2
2
2
C
1
1
3
现在,我可以通过遍历列来迭代执行此操作,即
df = pd.DataFrame{
"Name":['A', 'B', 'C'],
"Sales":[1000, 2000, 5400],
"Volume":[100, 200, 500],
"Reviews":[1000, 2000, 5400]
}
# make a copy of the original df
ranked_df = df.copy()
# define our interested columns
interest_cols = ['Sales', 'Volume', 'Reviews']
for col in interest_cols:
ranked_df[f"{col}_rank"] = df[col].rank()
# drop the cols not needed
...
但我的问题是:是否有更优雅或 Pythonic 的方式来做到这一点?也许申请数据框?或者通过将其扔给 numpy 来进行一些矢量化操作?
谢谢。
您可以使用 transform/apply 来命中每一列
df.set_index('Name').transform(pd.Series.rank, ascending = False)
Sales Volume Reviews
Name
A 3.0 3.0 1.0
B 2.0 2.0 2.0
C 1.0 1.0 3.0
df.set_index('Name').rank().reset_index()
Name Sales Volume Reviews
0 A 1.0 1.0 1.0
1 B 2.0 2.0 2.0
2 C 3.0 3.0 3.0
我想创建一个基于多列 pandas 数据框的排名 table,其中包含多个数字列。
我们以下面的df为例:
Name | Sales | Volume | Reviews |
---|---|---|---|
A | 1000 | 100 | 100 |
B | 2000 | 200 | 50 |
C | 5400 | 500 | 10 |
我想创建一个新的 table、ranked_df,它按降序排列每列中的值,同时保持基本相同的格式:
Name | Sales_rank | Volume_rank | Reviews_rank |
---|---|---|---|
A | 3 | 3 | 1 |
B | 2 | 2 | 2 |
C | 1 | 1 | 3 |
现在,我可以通过遍历列来迭代执行此操作,即
df = pd.DataFrame{
"Name":['A', 'B', 'C'],
"Sales":[1000, 2000, 5400],
"Volume":[100, 200, 500],
"Reviews":[1000, 2000, 5400]
}
# make a copy of the original df
ranked_df = df.copy()
# define our interested columns
interest_cols = ['Sales', 'Volume', 'Reviews']
for col in interest_cols:
ranked_df[f"{col}_rank"] = df[col].rank()
# drop the cols not needed
...
但我的问题是:是否有更优雅或 Pythonic 的方式来做到这一点?也许申请数据框?或者通过将其扔给 numpy 来进行一些矢量化操作?
谢谢。
您可以使用 transform/apply 来命中每一列
df.set_index('Name').transform(pd.Series.rank, ascending = False)
Sales Volume Reviews
Name
A 3.0 3.0 1.0
B 2.0 2.0 2.0
C 1.0 1.0 3.0
df.set_index('Name').rank().reset_index()
Name Sales Volume Reviews
0 A 1.0 1.0 1.0
1 B 2.0 2.0 2.0
2 C 3.0 3.0 3.0