如何基于列内元素序列逐行比较重排Pandas DataFrame的列
问题背景
现有如下Pandas DataFrame:
import pandas as pd df = pd.DataFrame(data = {'a':[3,0,2,1],'b':[4,3,2,1],'c':[3,2,1,0],'d':[4,3,2,0]}) print(df)
输出结果:
a b c d 0 3 4 3 4 1 0 3 2 3 2 2 2 1 2 3 1 1 0 0
需要对DataFrame的列进行重排:比较两列时逐行依次对比数值,首行数值相同则继续比较下一行,数值更大的列优先排在前面。例如元素为[3,2,1]的列要排在[3,2,0]的列之前,最终期望得到如下结果:
b d c a 0 4 4 3 3 1 3 3 2 0 2 2 2 1 2 3 1 0 0 1
解决方案
利用Python元组的逐元素比较特性即可实现需求,代码如下:
import pandas as pd df = pd.DataFrame(data = {'a':[3,0,2,1],'b':[4,3,2,1],'c':[3,2,1,0],'d':[4,3,2,0]}) # 按列的数值元组降序排序列名 sorted_columns = sorted(df.columns, key=lambda col: tuple(df[col]), reverse=True) # 重新生成排序后的DataFrame dd = df[sorted_columns] print(dd)
原理说明
- Python中的元组会逐元素依次比较,正好匹配题目中"首行相同则比较下一行"的规则。比如列
b的数值元组是(4,3,2,1),列d的数值元组是(4,3,2,0),前三个元素相同,第四个元素1>0,所以b排在d前面。 sorted函数通过key参数指定排序依据为列的数值元组,reverse=True让数值更大的列排在前面,完全符合需求。
内容的提问来源于stack exchange,提问作者skywave1980
相关产品推荐
相关产品推荐

