是否有一种方法可以在Dataframe的多行和多列中对值进行排序?

2024-10-05 17:47:25 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我有一个包含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,但它似乎只对行或列起作用,而不是组合


Tags: 数据框架dataframerow1row2row3column1rank
3条回答

您可以使用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
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

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

相关问题 更多 >