我有一个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}}
答案 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列非常快。