gpt4 book ai didi

python - 用多列交换或交换 pandas 数据框中的列名

转载 作者:行者123 更新时间:2023-12-05 09:12:45 24 4
gpt4 key购买 nike

我只想交换(交换) 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)

我得到了:

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

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

最佳答案

如果你有一个可以用来映射东西的字典,那么它就可以正常工作。

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)

关于python - 用多列交换或交换 pandas 数据框中的列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57446160/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com