删除多索引和自动重命名列

Drop Multi-index and auto rename columns

我想将以下输出转换为:

一些数据:

import pandas as pd
import numpy as np

data1 = {'Name': ["Joe", "Joe", "Joe","Jane","Jane"],
        'Job': ["Analyst","Manager","Director","Analyst","Manager"],
        'Job Eff Date': ["1/1/2015","1/1/2016","7/1/2016","1/1/2015","1/1/2016"]}
df2 = pd.DataFrame(data1, columns=['Name', 'Job', 'Job Eff Date'])

def tgrp(df):
    df = df.drop('Name', axis=1)
    return df.reset_index(drop=True).T

df2.groupby('Name').apply(tgrp).unstack()

尝试:

df3.columns = ['{} {}'.format(col[1], col[0]) for col in df3.columns]

如果您可以使用基于 0 的索引。否则改为 col[0] + 1

另一个解决方案join

df.columns = [' '.join((col[1], str(col[0] + 1))) for col in df.columns]
print (df)
        Job 1 Job Eff Date 1    Job 2 Job Eff Date 2     Job 3 Job Eff Date 3
Name                                                                         
Jane  Analyst       1/1/2015  Manager       1/1/2016       NaN            NaN
Joe   Analyst       1/1/2015  Manager       1/1/2016  Director       7/1/2016

如果需要删除索引名称,请使用rename_axispandas 0.18.0中新增):

df.columns = [' '.join((col[1], str(col[0] + 1))) for col in df.columns]
df = df.rename_axis(None)
print (df)
        Job 1 Job Eff Date 1    Job 2 Job Eff Date 2     Job 3 Job Eff Date 3
Jane  Analyst       1/1/2015  Manager       1/1/2016       NaN            NaN
Joe   Analyst       1/1/2015  Manager       1/1/2016  Director       7/1/2016

工作原理:

列表理解将MultiIndex转换为tupleslist,由join加入,但首先需要添加1并转换[=元组的每个第一项的 23=] 到 str

print ([col for col in df.columns])
[(0, 'Job'), (0, 'Job Eff Date'), 
 (1, 'Job'), (1, 'Job Eff Date'), 
 (2, 'Job'), (2, 'Job Eff Date')]

输出是字符串列表,分配给列名:

print ([' '.join((col[1], str(col[0] + 1))) for col in df.columns])
['Job 1', 'Job Eff Date 1', 'Job 2', 'Job Eff Date 2', 'Job 3', 'Job Eff Date 3']