我有一个带有200列以上的dataframe。问题是因为它们是按顺序生成的,所以我需要按以下顺序重新排列列:

['Q1.3','Q6.1','Q1.2','Q1.1',......]


我有什么办法可以在Python中执行此操作吗?

评论

该问题在顶部带有标题“该问题已经在这里有了答案:如何更改DataFrame列的顺序?(34个答案)去年关闭了。”它说的问题是一个完全不同的问题,因此应删除此横幅和链接。

#1 楼

df = df.reindex(sorted(df.columns), axis=1)


这假定对列名称进行排序将给出所需的顺序。如果列名不会按字典顺序排序(例如,如果您希望列Q10.3出现在Q9.1之后),则需要以不同的方式排序,但这与熊猫无关。

评论


我喜欢这种方法,因为可以使用相同的方法对行进行排序(我需要对行和列进行排序)。虽然使用相同的方法,但是您可以省略axis参数(或提供其默认值0),例如df.reindex_axis(sorted(non_sorted_row_index)),它等效于df.reindex(sorted(non_sorted_row_index))

–红豌豆
15年11月17日在19:57

请注意,重新索引不是就地完成的,因此要将排序实际应用到df,您必须使用df = df.reindex_axis(...)。另外,请注意,这种方法很容易进行非字典排序,因为列名列表可以分别按任意顺序排序,然后传递给reindex_axis。使用@Wes McKinney(df = df.sort_index(axis = 1))建议的替代方法无法做到这一点,但是对于纯字典编排而言,这种方法更为干净。

– WhoIsJack
18年1月28日在23:49

不确定何时不建议使用'.reindex_axis',请参见以下消息。 FutureWarning:不建议使用“ .reindex_axis”,并将在以后的版本中将其删除。使用“ .reindex”代替。这与ipykernel软件包分开,因此我们可以避免导入,直到

–编码问题
18年5月8日在8:27



这实际上是否对数据框的列进行排序?乍一看,这似乎只是对列名称进行排序,然后重置索引。

–pbreach
18年7月8日在21:13

reindex_axis已弃用,并导致FutureWarning。但是,.reindex可以正常工作。对于以上示例,请使用df.reindex(columns = sorted(df.columns))

–登录
18-09-17在17:43

#2 楼

您还可以简洁地执行更多操作:

df.sort_index(axis=1)



确保将结果分配回:

df = df.sort_index(axis=1)


或就地执行:

df.sort_index(axis=1, inplace=True)


评论


记得按照@multigoodverse做df = df.sort_index(axis = 1)

–高坚
17年1月6日14:59



或使用df.sort_index(axis = 1,inplace = True)修改df

– Jakub
17年1月1日在17:12

另外,如果开发者担心它,sort_index比重新索引要快

– ExtractTable.com
19年11月15日15:57

#3 楼

您可以这样做:

df[sorted(df.columns)]



编辑:简称为

df[sorted(df)]


评论


我为此得到“'DataFrame'对象不可调用”。版本:熊猫0.14。

–multigoodverse
15年1月29日在10:39

@lvelin,您知道为什么sorted(df)有效吗,它记录在某处吗?

– zyxue
20年4月1日在17:23

@ zyxue,sorted将寻找迭代类魔术方法,以找出要排序的内容。看看这个问题stackoverflow.com/questions/48868228/…

–伊夫林
20年4月2日在19:29

#4 楼

Tweet的答案可以通过

data.reindex_axis(sorted(data.columns, key=lambda x: float(x[1:])), axis=1)

传递给BrenBarn上面的答案

因此,对于您的示例,说:

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


#5 楼

对于几列,您可以将列排序为所需的内容:

#['A', 'B', 'C'] <-this is your columns order
df = df[['C', 'B', 'A']]


本示例显示了列的排序和切片:

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     


#6 楼

不要忘记在Wes的答案中添加“ inplace = True”或将结果设置为新的DataFrame。

df.sort_index(axis=1, inplace=True)


#7 楼

如果您需要一个任意序列而不是排序序列,则可以执行以下操作:

sequence = ['Q1.1','Q1.2','Q1.3',.....'Q6.1',......]
your_dataframe = your_dataframe.reindex(columns=sequence)


我在2.7.10中对此进行了测试,对我有用。

#8 楼

最快的方法是:

df.sort_index(axis=1)


请注意,这将创建一个新实例。因此,您需要将结果存储在新变量中:

sortedDf=df.sort_index(axis=1)


#9 楼

通过sort方法和sorted函数,您可以提供一个自定义函数来提取用于比较的键:

>>> ls = ['Q1.3', 'Q6.1', 'Q1.2']
>>> sorted(ls, key=lambda x: float(x[1:]))
['Q1.2', 'Q1.3', 'Q6.1']


评论


这通常适用于列表,我对此很熟悉。如何将其应用于熊猫DataFrame?

–pythOnometrist
2012年6月17日在2:24

不确定,我承认我的答案并非特定于该库。

– tweet
2012年6月17日在3:04

#10 楼

一种用例是,您用某些前缀命名了(某些)列,并且您希望这些前缀与这些列一起以某种特定顺序(不是字母顺序)排序。

例如,您可以使用Ft_来启动所有功能,使用Lbl_来启动标签,等等,并且您想要所有未加前缀的列,然后是所有功能,然后是标签。您可以使用以下功能来执行此操作(我将注意到使用sum来减少列表的效率问题,但这不是问题,除非您有很多列,但我没有):

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)   ], [])  ]


#11 楼

print df.sort_index(by='Frequency',ascending=False)


如果要基于列对数据集进行排序,则by是列的名称