将数据帧的内容复制到另一个具有相同行和列的数据帧

时间:2021-06-18 18:55:32

标签: python pandas dataframe

我需要按行将具有多列的数据框转换为“排序顺序”表。 这是我的测试数据:

raw = [{'MS':100, 'KR':1, 'KU': 0.1, 'BR': 33},
       {'MS':9,   'KR':4, 'KU': 0.4, 'BR': 40},
       {'MS':40,  'KR':6, 'KU': 0.2, 'BR': 50},
       {'MS':59,  'KR':3, 'KU': 0.4, 'BR': 30},
       {'MS':33,  'KR':8, 'KU': 0.5, 'BR': 20},
       {'MS':40,  'KR':2, 'KU': 0.2, 'BR': 90},
       {'MS':70,  'KR':2, 'KU': 0.01, 'BR': 80},
    ]

raw_df = pd.DataFrame(raw, index=['A','B','C','D','E','F','G'])

基本上我需要的是从这里开始:

    MS   KR  KU  BR 
A  100   1  0.10 33 
B    9   4  0.40 40 
C   40   6  0.20 50 
D   59   3  0.40 30 
E   33   8  0.50 20 
F   40   2  0.20 90 
G   70   2  0.01 80 

到这里(最高原始值排名更高):

    MS   KR   KU    BR   
C   40   6    0.20  50   
E   33   8    0.50  20  
D   59   3    0.40  30  
F   40   2    0.20  90 
B   9    4    0.40  40  
G   70   2    0.01  80  
A   100   1   0.10  33  

我对每一列进行了排名,然后通过取平均值创建了一个行排名,然后按该新行对数据框进行排序。 现在我有以下排名数据框,但我需要使用旧的原始数据而不是当前数据复制内容。

    MS   KR   KU   BR   rank
C  4.5  2.0  4.5  3.0  3.500
E  6.0  1.0  1.0  7.0  3.750
D  3.0  4.0  2.5  6.0  3.875
F  4.5  5.5  4.5  1.0  3.875
B  7.0  3.0  2.5  4.0  4.125
G  2.0  5.5  7.0  2.0  4.125
A  1.0  7.0  6.0  5.0  4.750

我可以使用 iterrrow() 但对于大型数据集来说它很昂贵。这里有什么熊猫福可以做到这一点吗?

2 个答案:

答案 0 :(得分:2)

如果我理解正确:如果 df_rank 包含您的已排序数据框而 raw_df 包含您未排序的数据框,您可以这样做:

print(raw_df.loc[df_rank.index])

打印:

    MS  KR    KU  BR
C   40   6  0.20  50
E   33   8  0.50  20
D   59   3  0.40  30
F   40   2  0.20  90
B    9   4  0.40  40
G   70   2  0.01  80
A  100   1  0.10  33

答案 1 :(得分:1)

如果您从 raw_df 创建它,您可以:

raw_df.reindex(raw_df.rank(ascending=False).mean(axis=1).sort_values().index)

输出:

     MS  KR    KU   BR
C    40   6  0.20   50
E    33   8  0.50   20
D    59   3  0.40   30
F    40   2  0.20   90
B     9   4  0.40   40
G    70   2  0.01   80
A   100   1  0.10   33

我们按降序设置排名,按列取平均值,并使用 .reindex() 方法对 raw_df 进行排序。