我有一个带有200列以上的
dataframe
。问题是因为它们是按顺序生成的,所以我需要按以下顺序重新排列列:['Q1.3','Q6.1','Q1.2','Q1.1',......]
我有什么办法可以在Python中执行此操作吗?
#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是列的名称
评论
该问题在顶部带有标题“该问题已经在这里有了答案:如何更改DataFrame列的顺序?(34个答案)去年关闭了。”它说的问题是一个完全不同的问题,因此应删除此横幅和链接。