Python:对列进行排序

Python:对列进行排序,python,pandas,sorting,Python,Pandas,Sorting,我正在尝试对.csv文件的列进行排序。以下是列的名称和顺序: 'Unnamed: 0', 'Unnamed: 1', '25Mg BLK', '25Mg 1', '25Mg 2', '44Ca BLK', '44Ca 1', '44Ca 2', '137Ba BLK', '137Ba 1', '137Ba 2', '25Mg 3', '25Mg 4', '25Mg 5', '44Ca 3', '44Ca 4', 44Ca 5', '137Ba 3', '137Ba 4', '137B

我正在尝试对.csv文件的列进行排序。以下是列的名称和顺序:

'Unnamed: 0', 'Unnamed: 1', 
'25Mg BLK', '25Mg 1', '25Mg 2', 
'44Ca BLK', '44Ca 1', '44Ca 2', 
'137Ba BLK', '137Ba 1', '137Ba 2', 
'25Mg 3', '25Mg 4', '25Mg 5', 
'44Ca 3', '44Ca 4', 44Ca 5', 
'137Ba 3', '137Ba 4', '137Ba 5',
这是我想要的订单:

'Unnamed: 0', 'Unnamed: 1', 
'25Mg BLK', '25Mg 1', '25Mg 2', '25Mg 3', '25Mg 4', '25Mg 5',
'44Ca BLK', '44Ca 1', '44Ca 2', '44Ca 3', '44Ca 4', 44Ca 5',
'137Ba BLK', '137Ba 1', '137Ba 2', '137Ba 3', '137Ba 4', '137Ba 5',
当前我的代码如下所示:

import pandas as pd

df = pd.read_csv("real_data.csv", header=2)

df2 = df.reindex_axis(sorted(df.columns), axis=1)

print(df2)

df2.to_csv("sorted.csv")
使用当前代码,我得到以下列顺序的结果:

'137Ba 1', '137Ba 2', '137Ba 3', '137Ba 4', '137Ba 5', '137Ba BLK',
'25Mg 1', '25Mg 2', '25Mg 3', '25Mg 4', '25Mg 5', '25Mg BLK', 
'44Ca 1', '44Ca 2', '44Ca 3', '44Ca 4', '44Ca 5', '44Ca BLK'
所以我已经计算出,我必须将一个函数传递给排序函数,以指定我希望它如何排序,但我无法计算出一个函数可以做到这一点


非常感谢您的任何意见

使用helper
DataFrame
,对列进行排序,然后通过
a.index
重新编制索引:

c = df.columns
a = c[2:].to_series().str.extract('(\d+)([a-zA-Z]+)\s+(\d*)', expand=True)
#convert ints
a[0] = a[0].astype(int)
#convert to floats, non exis numbers generate NaNs
a[2] = pd.to_numeric(a[2], errors='coerce')
a = a.sort_values([0,1,2], na_position='first')
print (a)
             0   1    2
25Mg BLK    25  Mg  NaN
25Mg 1      25  Mg  1.0
25Mg 2      25  Mg  2.0
25Mg 3      25  Mg  3.0
25Mg 4      25  Mg  4.0
25Mg 5      25  Mg  5.0
44Ca BLK    44  Ca  NaN
44Ca 1      44  Ca  1.0
44Ca 2      44  Ca  2.0
44Ca 3      44  Ca  3.0
44Ca 4      44  Ca  4.0
44Ca 5      44  Ca  5.0
137Ba BLK  137  Ba  NaN
137Ba 1    137  Ba  1.0
137Ba 2    137  Ba  2.0
137Ba 3    137  Ba  3.0
137Ba 4    137  Ba  4.0
137Ba 5    137  Ba  5.0

df = df.reindex_axis(c[:2].tolist() + a.index.tolist(), axis=1)
print (df)
请看下面的答案: 它似乎做了你想做的事。为了清楚起见,我将在这里发布代码

sequence = [Your sequence as a list as above]
your_dataframe = your_dataframe.reindex(columns=sequence)

然后执行
df.reindex(l1)

您可以进一步解释排序背后的逻辑吗?为什么
137Ba BLK
出现在
137Ba 1
之前?除非你指定一个清晰的排序逻辑,否则我们(或你)很难编写一个好的排序函数。该文件是测量不同同位素的设备的输出。这里137Ba是特定的同位素。BLK代表空白或背景值,1,2,3,。。。这是同位素的一系列测量。谢谢你的回复。我希望有一个程序可以在没有任何输入的情况下对列进行排序,因为我正在处理的文件可能有不同数量的元素。哦,我忘记了,需要
c[:2].tolist()+a.index.tolist()
谢谢您的回复!a=c[2:].to_series().str.extract('(\d+)([a-zA-Z]+)\s+(\d*),expand=True)这行中的c是什么?
c=df.columns
正是我想要的方式!谢谢!不客气!如果我的答案有用,别忘了-点击复选标记(
),将其从灰显切换为填充。谢谢
from natsort import natsorted, ns

l1=list(map(lambda x: x.replace('BLK', '0000000'), l1))
l1=natsorted(l1)
l1=list(map(lambda x: x.replace('0000000', 'BLK'), l1))

l1
Out[1125]: 
['25Mg BLK',
 '25Mg 1',
 '25Mg 2',
 '25Mg 3',
 '25Mg 4',
 '25Mg 5',
 '44Ca BLK',
 '44Ca 1',
 '44Ca 2',
 '44Ca 3',
 '44Ca 4',
 '44Ca 5',
 '137Ba BLK',
 '137Ba 1',
 '137Ba 2',
 '137Ba 3',
 '137Ba 4',
 '137Ba 5']