Python Pandas:对列进行排序

Posted

技术标签:

【中文标题】Python Pandas:对列进行排序【英文标题】:Python Pandas: Sorting Columns 【发布时间】:2018-04-11 13:52:04 【问题描述】:

我正在尝试对 .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'

所以我已经想通了,我必须将一个函数传递给 sorted 函数来指定我希望它如何排序,但我想不出一个函数可以做到这一点。

非常感谢任何输入!

【问题讨论】:

你能解释一下你排序背后的逻辑吗?为什么137Ba BLK 出现在137Ba 1 之前?除非你指定明确的排序逻辑,否则我们(或你)很难写出好的排序函数。 该文件是测量不同同位素的设备的输出。这里 137Ba 是特定同位素。 BLK 代表空白值或背景值,1,2,3,... 是该同位素的一系列测量值。 【参考方案1】:

使用助手DataFrame,对列进行排序,然后按a.indexreindex进行排序:

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)

【讨论】:

哎呀,我忘了,需要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 完全按照我想要的方式工作!非常感谢! 不客气!如果我的回答有帮助,请不要忘记 accept 它 - 单击答案旁边的复选标记 () 将其从灰色切换为已填充。谢谢。【参考方案2】:

在此处查看此答案:https://***.com/a/33555435/8239103 它似乎做你想做的事。为清楚起见,我将在此处发布代码。

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

【讨论】:

感谢您的回复。我希望有一个程序可以在没有任何输入的情况下对列进行排序,因为我正在使用的文件可能有不同数量的元素。【参考方案3】:
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']

然后做df.reindex(l1)

【讨论】:

以上是关于Python Pandas:对列进行排序的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 按值 1 对列进行分组并按频率排序

如何在熊猫中按值计数对列进行排序

以日期为列名的 Python Pandas Pivot() 需要排序和格式化

pandas笔记:根据列索引名称/行索引名称 对列重新排序

pandas-对列中具有相同值的连续行进行分组和聚合

在 jQuery DataTables 中使用锚标记对列进行排序