如何使用 pandas 保留重复的列名和融化数据框?

How to retain duplicate column names and melt dataframe using pandas?

我有一个如下所示的数据框

tdf = pd.DataFrame(
    {'Unnamed: 0' : ['Region','Asean','Asean','Asean','Asean','Asean','Asean'],
     'Unnamed: 1' : ['Name', 'DEF', 'GHI', 'JKL', 'MNO', 'PQR','STU'],
     '2017Q1' : ['target_achieved',2345,5678,7890,1234,6789,5454],
     '2017Q1' : ['target_set', 3000,6000,8000,1500,7000,5500],
     '2017Q1' : ['score', 86, 55, 90, 65, 90, 87],
     '2017Q2' : ['target_achieved',245,578,790,123,689,454],
     '2017Q2' : ['target_set', 300,600,800,150,700,500],
     '2017Q2' : ['score', 76, 45, 70, 55, 60, 77]})

如您所见,我的列名重复了。

意思是,有 3 列(每列 2017Q1,每列 2017Q2

dataframe 不允许有重名的列。

我尝试了以下方法以获得预期的输出

tdf.columns = tdf.iloc[0]v # but this still ignores the column with duplicate names

更新

阅读 excel 文件后,根据 jezrael 的回答,我得到以下显示

我希望我的输出如下所示

首先在列和索引中创建 MultiIndex

df = pd.read_excel(file, header=[0,1], index_col=[0,1])

如果不可能,这里是示例数据的替代方案 - 将列和第一行数据转换为 MultiIndex in columns,将第一列转换为 MultiIndex in index

tdf = pd.read_excel(file)
tdf.columns = pd.MultiIndex.from_arrays([tdf.columns, tdf.iloc[0]])

df = (tdf.iloc[1:]
         .set_index(tdf.columns[:2].tolist())
         .rename_axis(index=['Region','Name'], columns=['Year',None]))

print (df.index)
MultiIndex([('Asean', 'DEF'),
            ('Asean', 'GHI'),
            ('Asean', 'JKL'),
            ('Asean', 'MNO'),
            ('Asean', 'PQR'),
            ('Asean', 'STU')],
           names=['Region', 'Name'])


print (df.columns)
MultiIndex([('2017Q1', 'target_achieved'),
            ('2017Q1',      'target_set'),
            ('2017Q1',           'score'),
            ('2017Q2', 'target_achieved'),
            ('2017Q2',      'target_set'),
            ('2017Q2',           'score')],
           names=['Year', None])

然后重塑:

df1 = df.stack(0).reset_index()
print (df1)
   Region Name    Year score target_achieved target_set
0   Asean  DEF  2017Q1    86            2345       3000
1   Asean  DEF  2017Q2    76             245        300
2   Asean  GHI  2017Q1    55            5678       6000
3   Asean  GHI  2017Q2    45             578        600
4   Asean  JKL  2017Q1    90            7890       8000
5   Asean  JKL  2017Q2    70             790        800
6   Asean  MNO  2017Q1    65            1234       1500
7   Asean  MNO  2017Q2    55             123        150
8   Asean  PQR  2017Q1    90            6789       7000
9   Asean  PQR  2017Q2    60             689        700
10  Asean  STU  2017Q1    87            5454       5500
11  Asean  STU  2017Q2    77             454        500

编辑:已编辑问题的解决方案类似:

df = pd.read_excel(file, header=[0,1], index_col=[0,1])
df1 = df.rename_axis(index=['Region','Name'], columns=['Year',None]).stack(0).reset_index()