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

Posted

技术标签:

【中文标题】删除多索引和自动重命名列【英文标题】:Drop Multi-index and auto rename columns 【发布时间】:2016-12-29 18:26:24 【问题描述】:

我想将下面的输出转换成:

删除多索引(应该只是一行索引)

相应编号为作业 1、作业生效日期 1、作业 2、作业生效日期 2,等等。

如果我选择添加或删除其他变量,我希望它具有可扩展性,我希望不必修改代码以适应它(此示例已按比例缩小)。

一些数据:

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()

【问题讨论】:

【参考方案1】:

试试:

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

如果您对基于 0 的索引表示满意。否则改成col[0] + 1

【讨论】:

太棒了!它有效,但我不确定如何......我试图将它分开。我认为括号是一个替换功能,但为什么只有两个呢?还有,.format(col[1]--是指从多索引的顶部向下的层次吗?最后,它是如何摆脱***索引的? @Christopher 很多问题!我将尽我所能。 1. 括号是list comprehension,这是 Python 最梦幻的功能之一。或者你的意思是花括号?它们 + .format() 函数用于 Python 中的 string formatting。 3. 当您遍历 df3.columns 时,您将获得每个层次结构的名称作为每个列的元组。我使用str..format() 将它们连接到一个名称。【参考方案2】:

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

它是如何工作的:

列表解析将tuplesMultiIndex转换为list,由join连接,但首先必须添加1并将int转换为每个元组第一项的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']

【讨论】:

以上是关于删除多索引和自动重命名列的主要内容,如果未能解决你的问题,请参考以下文章

转换为具有水平显示和重命名列的多索引数据框

在 python 或 Pyspark 数据框中使用特殊字符重命名列

熊猫重命名列

如何使用 Visual Studio 数据库项目重命名列?

Visual Studio 数据库项目重命名列

使用 DACPAC,当表上有触发器时,如何重命名列?