按标签排序列

时间:2016-05-12 19:45:12

标签: python pandas

我有一个20列的df。第一列标题是基因,接下来的19个用于不同的实验。

gene    1-1164-KO-aa8   22-1264-wt-aa8   15-1175-wt-aa9  27-1195-KO-aa9   ...
abc      11.9898           11.9898         11.9898         11.9898        ...
cde      11.9898           11.9898         11.9898         11.9898        ... 
 .
 .

我需要根据标签对列进行排序。

保留第一列GENE,并仅根据标签的这一部分(wt-aa8,wt-aa9,KO-aa8,KO-aa9)对其余部分进行排序。

第一个GENE然后是所有wt-aa8,接着是所有wt-aa9,然后是所有KO-aa8,最后是所有KO-aa9。但排序后的列需要在订购后拥有原始全名(如1-1164-KO-aa8)。

所以看起来应该是这样的:

gene    22-1264-wt-aa8  22-1264-wt-aa8  1-1164-KO-aa8   27-1195-KO-aa9
abc      11.9898         11.9898         11.9898          11.9898
cde      11.9898         11.9898         11.9898          11.9898

通常我只在标题上有数字并执行df.sort显然不起作用,不幸的是我必须保留原始列名。

有关如何处理此事的任何想法?

链接到示例df。 {{3}}

2 个答案:

答案 0 :(得分:1)

如果具有相似字符串的列只需要彼此相邻,那么您可以相当简单地完成。

coldict = {c: c.split('-', 2)[2] for c in df.columns[1:]}
df = df[['gene'] + sorted(df.ix[:, 1:].columns, key=lambda x: coldict[x])]

首先,你创建一个只包含" sortable"列的一部分。我们仅在第一列之后使用列,以排除gene列。拆分基于您包含的文件,而不是示例中的文件,但您可以对其进行修改。

其次,您创建一个数据框,其中列顺序不是由原始列名确定,而是由字典中的(已排序)值确定。

答案 1 :(得分:0)

如果这个例子只有一个,通常你可以按数字排序,尝试在excel中打开它,然后你可以将列拖放到正确的顺序,然后再次保存。

交替地,将标题重命名为1.1-1164-KO-aa8 3.22-1264-wt-aa8 2.15-1175-wt-aa9 7.27-1195-KO-aa9

然后按编号排序。

确定黑客,但是对于20列非常快。