在Pandas datafram中按名称和编号重新排列列

2024-09-29 06:33:01 发布

您现在位置:Python中文网/ 问答频道 /正文

例如,我有一个数据帧,其中的列是这样的(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

我想像这样重新排列列:

^{pr2}$

我试过:

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))]

注意:App、Pear和Oro的数字r将取决于我开始使用的csv的r值

然而,到目前为止还没有成功。在

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


Tags: columns数据idappformatdfpearr2
2条回答

将自定义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

我认为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

^{pr2}$

相关问题 更多 >