有没有办法在 Pandas Dataframe 的多个行和列中对值进行排名?

Is there a way to rank a value within multiple rows and columns in Pandas Dataframe?

所以我有一个包含 3 列和 3 行的数据框(还有更多列,但为简单起见,我们忽略它们),我想在其中添加额外的 3 列,其中包含该组中值的排名。

输入如下:

        Column1    Column2    Column3
Row1      60         20         10
Row2      40         30         80
Row3      70         50         50 

期望的输出是:

        Column1    Column2    Column3   Column1_rank   Column2_rank   Column3_rank
Row1      60         20         10           3              8              9
Row2      40         30         80           6              7              1
Row3      70         50         50           2              4              4

我一直在查看 dataframe.rank,但它似乎只适用于行或列,而不是合并。

joinapply 试试这个:

lst = sorted(df.values.flatten().tolist())[::-1]
print(df.join(df.apply(lambda x: [lst.index(i) + 1 for i in x]), rsuffix='_rank'))

输出:

      Column1  Column2  Column3  Column1_rank  Column2_rank  Column3_rank
Row1       60       20       10             3             8             9
Row2       40       30       80             6             7             1
Row3       70       50       50             2             4             4
import pandas as pd
import numpy as np

df = pd.DataFrame([[60,20,10], [40,30,80], [70,50,50]], columns=['Column1','Column2','Column3'])
mapped = dict(map(reversed, enumerate(np.sort(df.values.flatten())[::-1],1)))

for each_column in df.columns:
  df[each_column + '_rank'] = df[each_column].map(mapped)

print(df)

#    Column1  Column2  Column3  Column1_rank  Column2_rank  Column3_rank
# 0       60       20       10             3             8             9
# 1       40       30       80             6             7             1
# 2       70       50       50             2             5             5

您可以使用join()+stack()+unstack():

df=df.join(df.stack().rank(ascending=False).unstack().astype(int),rsuffix='_rank')

df 的输出:

      Column1  Column2  Column3  Column1_rank  Column2_rank  Column3_rank
Row1       60       20       10             3             8             9
Row2       40       30       80             6             7             1
Row3       70       50       50             2             4             4