我只想交换(交换)熊猫中的列名,最好使用单线交换。另一个问题是我大约有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)
然后我得到了
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
但是我希望一些简单的单行代码就能工作以允许交换列名,而不必定义两对要交换的列名,而只需要定义一对列名并保留数据,并带有一些loc或iloc属性,例如:
df['PT011','PT012']=df['PT021','PT022']
具有预期的输出(也需要建议的订单):
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
答案如下: Renaming columns in pandas,例如:
df.columns = df.columns.str.replace('PT011','PT021')
不适合我的情况,因为它仍然需要同时提供两对列名称,或者需要重新分配所有列的名称,并且没有给出所需的列顺序。
答案 0 :(得分:1)
如果您有可用于映射内容的字典,则可以正常工作。
df_map = {'PT011':'PT021', 'PT012':'PT022'}
df.columns = [{**df_map, **{v:k for k,v in df_map.items()}}.get(x, x) for x in df.columns]
>>> df
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
或者您可以使用rename()
来提高安全性。
df.rename(columns={**df_map, **{v:k for k,v in df_map.items()}}, inplace=True)
当您说不想给它起两个名字时,我不确定您的意思。您怎么知道要交换哪些列?
关于您的后续问题:
df_map = {'PT011':'PT021', 'PT012':'PT022'}
df_column_order = df.columns.tolist()
df.rename(columns={**df_map, **{v:k for k,v in df_map.items()}}, inplace=True)
df = df.reindex(df_column_order, axis=1)
答案 1 :(得分:1)
我在熊猫文档中:Indexing and selecting data找到了一种简单的方法来做到这一点:
df[['PT011','PT021']]=df[['PT021','PT011']]
df[['PT012','PT022']]=df[['PT022','PT012']]
以期望的顺序输出:
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