我需要按行将具有多列的数据框转换为“排序顺序”表。 这是我的测试数据:
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() 但对于大型数据集来说它很昂贵。这里有什么熊猫福可以做到这一点吗?
答案 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 进行排序。