2017-10-19 148 views
1

我有例如像这样列的数据框(如图1为任意值,以简化这里的东西:重排列的名称和数量熊猫数据帧

  ID App R1 Pear R1 Oro R1 App R2 Pear R2 Oro R2 App R3 Pear R3 Oro R3 
0   1   1   1   1   1   1   1   1   1  1 
1   1   1   1   1   1   1   1   1   1  1 

我想重新安排这样的列:

  ID App R1 App R2 App R3 Pear R1 Pear R2 Pear R3 Oro R1 Oro R2 Oro R3 
0   1   1   1   1   1   1   1   1   1  1 
1   1   1   1   1   1   1   1   1   1  1 

我曾尝试:

df.columns = [['ID'] + ['App R{}'.format(r+1)] + ['Pear R{}'.format(r+1)] + ['Matched fragment ions R{}'.format(r+1)] + ['Oro R{}'.format(r+1)] for r in range(len(files))] 

注:应用程序,梨和奥罗的数r将取决于csv的号码我开始

但是,迄今为止没有成功。

谢谢,如果你能帮我解决这个问题。

+0

是的,更好的视觉对比 – Flora

回答

3

使用自定义sorted与查找键

In [4291]: look = {'I':0, 'A':1, 'P':2, 'O':3} # order for letters 

In [4292]: sorted(df.columns, key=lambda x: look.get(x[0], '')) # first letter key 
Out[4292]: 
['ID', 
'App R1', 
'App R2', 
'App R3', 
'Pear R1', 
'Pear R2', 
'Pear R3', 
'Oro R1', 
'Oro R2', 
'Oro R3'] 

In [4293]: df[sorted(df.columns, key=lambda x: look.get(x[0], ''))] 
Out[4293]: 
    ID App R1 App R2 App R3 Pear R1 Pear R2 Pear R3 Oro R1 Oro R2 \ 
0 1  1  1  1  1  1  1  1  1 
1 1  1  1  1  1  1  1  1  1 

    Oro R3 
0  1 
1  1 
+0

我是如此接近这一个我使用前3个字母来创建字典,并失败。这是超级 – Dark

+0

感谢您的回复@零!使用它时我遇到一个小问题。我有三个最后一列(我没有在我给出的例子中添加),它们有相同的第一个和第二个字母(例如Apr R1 R1 R2和Apr R3),我试图把整个列名称而不是第一个字母不幸的是,它像Bharath雪莉在他下面的评论中所说的那样失败了。你认为你有另一种解决方案吗?非常感谢 – Flora

+0

然后在更新'look'后使用3个字符,例如'look.get(x [:3],'')'0123'''''' – Zero

1

我觉得MultiIndex应该有所帮助:

#set all not R columns to index 
df = df.set_index(['ID']) 
#create multiindex 
df.columns = df.columns.str.split(expand=True) 
#custom reordering 
df = df.reindex(columns=['App','Pear','Oro'], level=0) 
print (df) 
    App  Pear  Oro  
    R1 R2 R3 R1 R2 R3 R1 R2 R3 
ID        
1 1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 1 

df.columns = df.columns.map(' '.join) 
print (df) 
    App R1 App R2 App R3 Pear R1 Pear R2 Pear R3 Oro R1 Oro R2 Oro R3 
ID                   
1  1  1  1  1  1  1  1  1  1 
1  1  1  1  1  1  1  1  1  1 
+0

感谢您的帮助。我已经为我的代码尝试了它,但只适用于'应用'而不是另一个。 “NaN在R1之后和价值之前是否正常? – Flora

+0

我无法模拟它 – jezrael

+0

但基本上它取决于你的需要。 MultiIndex可以帮助某些操作,例如如果需要与所有的“Oro”柱一起工作,例如一些arithemtic操作。如果不是,更好使用另一个零答案。 – jezrael