簡體   English   中英

Pandas 重命名操作在兩列而不是一列上更改列名

[英]Pandas rename operation change column name on two columns instead of one

我有一個如下所示的 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  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

對於我的分析,我需要執行一個導致兩個相同列名的數據透視操作。 我希望索引為 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.columns = ['post','pre'] + df.columns[2:].tolist()

編輯:

經過一些討論,最好不是刪除第一級,而是加入MultiIndex級別以避免duplicated columns names

df = pd.concat([pre, post])
df = df.pivot('BIB#','DAG')

df.columns = df.columns.map('_'.join)

第一次嘗試的問題

您將兩列重命名為相同值的原因是因為您的mapping是通過在嘗試中始終引用具有相同str內容的兩個列名來定義的(如下)。

mapping = {df.columns[0]:'post', df.columns[1]: 'pre'}
df = df.rename(columns=mapping)

此代碼基本上運行為“將內容與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
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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM