在 pandas 数据框中与多个列交换或交换列名称

Tom*_*asz 3 python dataframe pandas

我想仅交换(交换)pandas 中的列名,最好使用单行。另一个问题是我有大约 100 列,这导致我无法重新分配所有列名称,因此我想替换成对的选定列名称。我不知道列的索引(它会有所不同),所以我必须使用列名。

我尝试了以下代码:

import pandas as pd

probes = {'Spam': [0.0,1.0],
        'Ham': [1.0,0.0],
        'PT011': [0.11,0.21],
        'PT012': [0.12,0.22],
        'PT021': [0.21,0.11],
        'PT022': [0.22,0.12]}

df = pd.DataFrame(probes,columns= ['Spam','Ham','PT011', 'PT012','PT021','PT022'])
print("Before renaming:\n",df)
df.rename(columns={'PT011':'PT021', 'PT012':'PT022','PT021':'PT011','PT022':'PT012'}, inplace=True)
print("After renaming:\n",df)
Run Code Online (Sandbox Code Playgroud)

我得到了:

Before renaming:
    Spam  Ham  PT011  PT012  PT021  PT022
0   0.0  1.0   0.11   0.12   0.21   0.22
1   1.0  0.0   0.21   0.22   0.11   0.12
After renaming:
    Spam  Ham  PT021  PT022  PT011  PT012
0   0.0  1.0   0.11   0.12   0.21   0.22
1   1.0  0.0   0.21   0.22   0.11   0.12
Run Code Online (Sandbox Code Playgroud)

但我希望一些简单的单行代码可以工作,允许交换列名称,无需定义两对要交换的列名称,而是仅定义一对列名称,保留数据,并带有一些 loc 或 iloc 属性,喜欢:

df['PT011','PT012']=df['PT021','PT022']
Run Code Online (Sandbox Code Playgroud)

具有预期输出(也需要建议的顺序):

   Spam  Ham   PT011  PT012  PT021  PT022
0   0.0  1.0   0.21   0.22   0.11   0.12
1   1.0  0.0   0.11   0.12   0.21   0.22
Run Code Online (Sandbox Code Playgroud)

答案显示在: 重命名 pandas 中的列,例如:

df.columns = df.columns.str.replace('PT011','PT021')
Run Code Online (Sandbox Code Playgroud)

不适合我的情况,因为它仍然需要给出两对列名称,或者需要重新分配所有列的名称,并且没有给出所需的列顺序。

Tom*_*asz 7

在 pandas 文档:索引和选择数据中,我找到了一种简单易行的方法来执行此操作:

df[['PT011','PT021']]=df[['PT021','PT011']]
df[['PT012','PT022']]=df[['PT022','PT012']]
Run Code Online (Sandbox Code Playgroud)

它以所需的顺序给出输出:

After renaming:
    Spam  Ham  PT011  PT012  PT021  PT022
0   0.0  1.0   0.21   0.22   0.11   0.12
1   1.0  0.0   0.11   0.12   0.21   0.22
Run Code Online (Sandbox Code Playgroud)