簡體   English   中英

如何重命名重復的 MultiIndex 列名?

[英]How to rename the duplicated MultiIndex column names?

我有一個具有兩級列索引的 dataframe。

可重現的數據集。

df = pd.DataFrame(
   [ ['Gaz','Gaz','Gaz','Gaz'],
    ['X','X','X','X'],
    ['Y','Y','Y','Y'],
    ['Z','Z','Z','Z']],
columns=pd.MultiIndex.from_arrays([['A','A','C','D'],
                          ['Name','Name','Company','Company']])

df1

我想重命名重復的 MultiIndex 列,僅當 level-0 和 level-1 組合重復時。 然后在末尾添加一個后綴號。 比如下面這張。

df2

下面是我找到的一個解決方案,但它只適用於單級列索引。

class renamer():
def __init__(self):
    self.d = dict()

def __call__(self, x):
    if x not in self.d:
        self.d[x] = 0
        return x
    else:
        self.d[x] += 1
        return "%s_%d" % (x, self.d[x])
df = df.rename(columns=renamer())

我認為可以修改上述方法以支持多級情況,但是我對 pandas/python 太陌生。

提前致謝。

@Datanovice 這是為了向您澄清我需要的 output。 我有下面的片段。

import pandas as pd
import numpy as np

df = pd.DataFrame(
   [ ['Gaz','Gaz','Gaz','Gaz'],
    ['X','X','X','X'],
    ['Y','Y','Y','Y'],
    ['Z','Z','Z','Z']],
columns=pd.MultiIndex.from_arrays([
                        ['A','A','C','A'], 
                        ['A','A','C','A'],
                        ['Company','Company','Company','Name']]))

s = pd.DataFrame(df.columns.tolist())
cond = s.groupby(0).cumcount()

s = [np.where(cond.gt(0),s[i] + '_' + cond.astype(str),s[i]) for i in 
range(df.columns.nlevels)]
s = pd.DataFrame(s)
#print(s)


df.columns = pd.MultiIndex.from_arrays(s.values.tolist())

print(df)

目前的結果是——

電流輸出

我需要的是最后一段列索引不應該算作重復,因為“AA-Name”與前兩個不同。

再次感謝你。

可能是執行此操作的更好方法,但您可以從列中返回 dataframe 並對它們應用條件操作並重新分配它們。

df = pd.DataFrame(
   [ ['Gaz','Gaz','Gaz','Gaz'],
    ['X','X','X','X'],
    ['Y','Y','Y','Y'],
    ['Z','Z','Z','Z']],
columns=pd.MultiIndex.from_arrays([['A','A','C','A'],
                          ['Name','Name','Company','Company']])


s = pd.DataFrame(df.columns.tolist())

cond = s.groupby([0,1]).cumcount()

s[0] = np.where(cond.gt(0),s[0] + '_' + cond.astype(str),s[0])
s[1] = np.where(cond.gt(0),s[1] + '_' + cond.astype(str),s[1])

df.columns = pd.MultiIndex.from_frame(s)

print(df)

0    A    A_1       C       D
1 Name Name_1 Company Company
0  Gaz    Gaz     Gaz     Gaz
1    X      X       X       X
2    Y      Y       Y       Y
3    Z      Z       Z       Z

在此處輸入圖像描述

嘗試這個 -

arrays = [['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'],['A', 'A', 'A', 'B', 'C', 'C', 'D', 'D']]
tuples = list(zip(*arrays))

index = pd.MultiIndex.from_tuples(tuples)
df = pd.DataFrame(np.random.randn(3, 8), columns=index)
    A               B
    A   A   A   B   C   C   D   D
0   0   0   1   3   1   2   1   4
1   0   1   1   1   1   3   0   1
2   1   1   4   2   3   2   1   4

suffix = pd.DataFrame(df.columns)
suffix['count'] = suffix.groupby(0).cumcount()
suffix['new'] = [((i[0]+'_'+str(j)),(i[1]+'_'+str(j))) for i,j in zip(suffix[0],suffix['count'])]
new_index = pd.MultiIndex.from_tuples(list(suffix['new']))
df.columns = new_index

暫無
暫無

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

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