Python Pandas – 根据列名重新排列数据框中的列
我有一个超过200列的dataframe
(不要问为什么)。 问题是因为他们生成的顺序是
['Q1.3','Q6.1','Q1.2','Q1.1',......]
我需要重新排列列如下:
['Q1.1','Q1.2','Q1.3',.....'Q6.1',......]
有没有办法让我在Python中做到这一点?
df.reindex_axis(sorted(df.columns), axis=1)
这假定对列名进行sorting会给你想要的订单。 如果你的列名不按照字典顺序排列(例如,如果你想在Q9.1之后出现Q10.3的列),你需要以不同的方式sorting,但这与pandas没有任何关系。
你也可以做得更简洁:
df.sort_index(axis=1)
编辑 :
确保你保持价值
df = df.sort_index(axis=1)
或者做到位
df.sort_index(axis=1, inplace=True)
你可以做:
DF [sorting(df.columns)]
Tweet的答案可以通过上面的BrenBarn的答案
data.reindex_axis(sorted(data.columns, key=lambda x: float(x[1:])), axis=1)
所以对于你的例子,说:
vals = randint(low=16, high=80, size=25).reshape(5,5) cols = ['Q1.3', 'Q6.1', 'Q1.2', 'Q9.1', 'Q10.2'] data = DataFrame(vals, columns = cols)
你得到:
data Q1.3 Q6.1 Q1.2 Q9.1 Q10.2 0 73 29 63 51 72 1 61 29 32 68 57 2 36 49 76 18 37 3 63 61 51 30 31 4 36 66 71 24 77
然后做:
data.reindex_axis(sorted(data.columns, key=lambda x: float(x[1:])), axis=1)
导致:
data Q1.2 Q1.3 Q6.1 Q9.1 Q10.2 0 2 0 1 3 4 1 7 5 6 8 9 2 2 0 1 3 4 3 2 0 1 3 4 4 2 0 1 3 4
不要忘记将“inplace = True”添加到Wes的答案中,或将结果设置为新的DataFrame。
df.sort_index(axis=1, inplace=True)
如果你需要一个任意的序列而不是有序的序列,你可以这样做:
sequence = ['Q1.1','Q1.2','Q1.3',.....'Q6.1',......] your_dataframe = your_dataframe.reindex(columns=sequence)
我在2.7.10中testing了它,它为我工作。
对于几列,你可以把列顺序你想要的:
#['A', 'B', 'C'] <-this is your columns order df = df[['C', 'B', 'A']]
这个例子显示了sorting和切片的列:
d = {'col1':[1, 2, 3], 'col2':[4, 5, 6], 'col3':[7, 8, 9], 'col4':[17, 18, 19]} df = pandas.DataFrame(d)
你得到:
col1 col2 col3 col4 1 4 7 17 2 5 8 18 3 6 9 19
然后做:
df = df[['col3', 'col2', 'col1']]
导致:
col3 col2 col1 7 4 1 8 5 2 9 6 3
最快的方法是:
df.sort_index(axis=1)
请注意,这会创build一个新的实例。 因此,您需要将结果存储在一个新的variables中:
sortedDf=df.sort_index(axis=1)
sort
方法和sorted
函数允许您提供一个自定义函数来提取用于比较的密钥:
>>> ls = ['Q1.3', 'Q6.1', 'Q1.2'] >>> sorted(ls, key=lambda x: float(x[1:])) ['Q1.2', 'Q1.3', 'Q6.1']
一个用例是,您已经用某些前缀命名(某些)列,并且希望按照某些特定顺序(不按字母顺序)将这些前缀sorting在一起。
例如,您可能会使用Ft_
, Lbl_
等标签来启动所有function,并且首先需要所有前缀Lbl_
列,然后是所有function,然后是标签。 你可以用下面的函数做这个(我会注意到一个可能的效率问题,使用sum
来减less列表,但这不是一个问题,除非你有很多的列,我不这样做):
def sortedcols(df, groups = ['Ft_', 'Lbl_'] ): return df[ sum([list(filter(re.compile(r).search, list(df.columns).copy())) for r in (lambda l: ['^(?!(%s))' % '|'.join(l)] + ['^%s' % i for i in l ] )(groups) ], []) ]
print df.sort_index(by='Frequency',ascending=False)
其中by是列的名称,如果您想根据列对数据集进行sorting