我有一个数据框存储了数字数据,另一个数据框是类别。但是,我想同时对两个数据框进行排序。
df_A中的每个条目都可以映射到df_B。作为df_A存储数字数据,而作为df_B存储其类别。因此,最终,我想重建一个新的数据框,使其具有一个数据框来存储每个类别的数字数据。我能想到的是同时对df_A和df_B进行排序,然后重命名df_A的索引。
>>print (df_A)
26 27 28 33
3 0.9 1.0 0.4 0.0
4 1.0 0.8 1.0 0.4
5 0.9 1.0 1.0 0.9
>>print (df_B)
26 27 28 33
3 BL LP PE BL
4 PE BL LP PE
5 LP PE BL LP
预期结果:
26 27 28 33
BL 0.9 0.8 1.0 0.0
PE 1.0 1.0 0.4 0.8
LP 0.9 1.0 1.0 0.9
答案 0 :(得分:1)
根据第二个数据的列对第一个数据帧的列进行排序,第二个数据列用整数映射,然后argsort返回值的索引位置。按该顺序查询第一个值。
>>> order = {'BL': 0, 'PE': 1, 'LP': 2}
>>> df_A.apply(lambda x: list(x.iloc[df_B[x.name].map(order).argsort()]))
26 27 28 33
3 0.9 0.8 1.0 0.0
4 1.0 1.0 0.4 0.4
5 0.9 1.0 1.0 0.9
>>> df.index = order.keys()
>>> df
26 27 28 33
BL 0.9 0.8 1.0 0.0
PE 1.0 1.0 0.4 0.4
LP 0.9 1.0 1.0 0.9