提问人:pythOnometrist 提问时间:6/17/2012 最后编辑:fantabolouspythOnometrist 更新时间:5/31/2023 访问量:564443
根据列名对 pandas DataFrame 中的列进行排序 [duplicate]
Sorting columns in pandas dataframe based on column name [duplicate]
问:
我有一个超过 200 列。问题是,当它们生成时,订单是dataframe
['Q1.3','Q6.1','Q1.2','Q1.1',......]
我需要按如下方式对列进行排序:
['Q1.1','Q1.2','Q1.3',.....'Q6.1',......]
有没有办法让我在 Python 中做到这一点?
答:
df = df.reindex(sorted(df.columns), axis=1)
这假定对列名称进行排序将给出所需的顺序。如果你的列名不能按字典顺序排序(例如,如果你希望列 Q10.3 出现在 Q9.1 之后),你需要以不同的方式排序,但这与 pandas 无关。
评论
axis
0
df.reindex_axis(sorted(non_sorted_row_index))
df.reindex(sorted(non_sorted_row_index))
df = df.reindex_axis(...)
reindex_axis
df = df.sort_index(axis=1)
reindex_axis
已弃用,并导致 .但是,工作正常。对于上面的示例,请使用FutureWarning
.reindex
df.reindex(columns=sorted(df.columns))
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']
评论
您还可以更简洁地执行以下操作:
df.sort_index(axis=1)
确保将结果分配回去:
df = df.sort_index(axis=1)
或者,就地执行:
df.sort_index(axis=1, inplace=True)
评论
df = df.sort_index(axis=1)
df
df.sort_index(axis=1, inplace=True)
sort_index
reindex
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
你可以做:
df[sorted(df.columns)]
编辑:较短的是
df[sorted(df)]
评论
sorted(df)
sorted
magic methods
不要忘记在 Wes 的答案中添加“inplace=True”或将结果设置为新的 DataFrame。
df.sort_index(axis=1, inplace=True)
最快的方法是:
df.sort_index(axis=1)
请注意,这将创建一个新实例。因此,您需要将结果存储在一个新变量中:
sortedDf=df.sort_index(axis=1)
print df.sort_index(by='Frequency',ascending=False)
其中 by 是列的名称,如果要根据列对数据集进行排序
如果你需要一个任意序列而不是排序序列,你可以做:
sequence = ['Q1.1','Q1.2','Q1.3',.....'Q6.1',......]
your_dataframe = your_dataframe.reindex(columns=sequence)
我在 2.7.10 中对此进行了测试,它对我有用。
对于多个列,您可以根据需要按顺序排列列:
#['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
一个用例是,您已经用一些前缀命名了(某些)列,并且您希望使用这些前缀并按某种特定顺序(而不是按字母顺序)对列进行排序。
例如,您可能以 、 标签等开头所有要素,并且希望首先使用所有无前缀的列,然后是所有要素,然后是标签。您可以使用以下函数执行此操作(我将注意到用于减少列表的可能效率问题,但除非您有很多列,否则这不是问题,而我没有):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) ], []) ]
评论