Python 重命名操作更改两列而不是一列的列名
我有一个熊猫数据框,看起来像这样:Python 重命名操作更改两列而不是一列的列名,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个熊猫数据框,看起来像这样: PRESTASJON PRESTASJON GRUPPE GRUPPE BIB# 1 1.097535 1.152557 RANDOM RANDOM 2 1.019290 1.060228 BLOCKED BLOCKED 3 1.078993 1.117647 BLOCKED BLOCK
PRESTASJON PRESTASJON GRUPPE GRUPPE
BIB#
1 1.097535 1.152557 RANDOM RANDOM
2 1.019290 1.060228 BLOCKED BLOCKED
3 1.078993 1.117647 BLOCKED BLOCKED
4 1.068155 1.136278 BLOCKED BLOCKED
5 1.001602 1.049030 BLOCKED BLOCKED
6 0.999831 1.086611 RANDOM RANDOM
7 1.079463 1.129667 RANDOM RANDOM
8 1.053904 1.122307 RANDOM RANDOM
9 1.146811 1.156933 BLOCKED BLOCKED
10 1.019548 1.086616 BLOCKED BLOCKED
11 1.026948 1.085549 BLOCKED BLOCKED
12 1.094309 1.130020 RANDOM RANDOM
13 1.210418 1.197499 BLOCKED BLOCKED
14 1.024908 1.054702 RANDOM RANDOM
15 0.981332 1.003535 RANDOM RANDOM
16 1.160070 1.204359 RANDOM RANDOM
在我的分析中,我需要执行一个pivot操作,该操作会产生两个相同的列名。我希望索引为0的列名为“POST”,索引为1的列名为“PRE”
我试过:
mapping = {df.columns[0]:'post', df.columns[1]: 'pre'}
df = df.rename(columns=mapping)
但这会更改两列上的列名:
pre pre GRUPPE GRUPPE
BIB#
1 1.097535 1.152557 RANDOM RANDOM
2 1.019290 1.060228 BLOCKED BLOCKED
3 1.078993 1.117647 BLOCKED BLOCKED
4 1.068155 1.136278 BLOCKED BLOCKED
5 1.001602 1.049030 BLOCKED BLOCKED
6 0.999831 1.086611 RANDOM RANDOM
7 1.079463 1.129667 RANDOM RANDOM
8 1.053904 1.122307 RANDOM RANDOM
9 1.146811 1.156933 BLOCKED BLOCKED
10 1.019548 1.086616 BLOCKED BLOCKED
11 1.026948 1.085549 BLOCKED BLOCKED
12 1.094309 1.130020 RANDOM RANDOM
13 1.210418 1.197499 BLOCKED BLOCKED
14 1.024908 1.054702 RANDOM RANDOM
15 0.981332 1.003535 RANDOM RANDOM
16 1.160070 1.204359 RANDOM RANDOM
,这不是我想要的。有人能告诉我一个好的解决方案吗?您可以通过列表设置新的列:
df.columns = ['post1','pre1','post2', 'pre2']
或:
编辑:
经过一些讨论后,更好的方法不是删除第一级,而是加入多索引
级别,以避免重复的列名称:
df = pd.concat([pre, post])
df = df.pivot('BIB#','DAG')
df.columns = df.columns.map('_'.join)
第一次尝试的问题
之所以将两列重命名为相同的值,是因为您的映射是通过在尝试中始终引用具有相同str
内容的两个列名来定义的(如下所示)
mapping={df.columns[0]:'post',df.columns[1]:'pre'}
df=df.rename(列=映射)
该代码基本上是“将内容与df.columns[0]
相同的列重命名为'post'
,然后将内容与df.columns[1]
相同的列重命名为'pre'
”。由于执行上述操作时,df.columns[0]==df.columns[1]
,因此这两列都将被重命名-首先重命名为'post'
,然后重命名为'pre'
解决方案
因为您知道要重命名的列的索引,所以可以按如下所示通过索引显式重命名每个列
df.columns.values[0]=“post”
df.columns.values[1]=“pre”
在问题中概述的df
上运行上述操作将导致:
post-pre-GRUPPE-GRUPPE
围嘴
1 1.097535 1.152557随机
2 1.019290 1.060228堵塞
3 1.078993 1.117647堵塞
4 1.068155 1.136278堵塞
5 1.001602 1.049030堵塞
6 0.999831 1.086611随机
7 1.079463 1.129667随机
8 1.053904 1.122307随机
9 1.146811 1.156933堵塞
10 1.019548 1.086616堵塞
11 1.026948 1.085549堵塞
12 1.094309 1.130020随机
13 1.210418 1.197499阻塞
14 1.024908 1.054702随机
15 0.981332 1.003535随机
16 1.160070 1.204359随机
如何创建这样的数据帧?也许应该有可能避免这个问题。我认为我没有使用最好的解决方案。但是我有两个类似的.csv文件,我已经将它们解析为一个数据帧。然后,我使用df=pd.concat([pre,post])将它们连接起来。接下来,我使用df=df.pivot('BIB#','DAG')。这导致了一个多索引。然后,我使用df.columns=df.columns.get_level_值(0)删除了第一个索引级别。我肯定这不是最好的方法:/但是为什么要删除多索引?我编辑答案来解决问题。是的,我想这可能是一个更好的解决方案。我想删除多索引,这样我就可以创建一个csv文件,以便在d3.js中轻松使用。没问题;)我只要求避免这个问题,这是可能的,所以工作,现在我知道为什么我的代码没有工作!
df = pd.concat([pre, post])
df = df.pivot('BIB#','DAG')
df.columns = df.columns.map('_'.join)