首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重命名具有任意顺序和重复列名的多索引列

重命名具有任意顺序和重复列名的多索引列
EN

Stack Overflow用户
提问于 2018-08-13 06:40:41
回答 1查看 537关注 0票数 1

我有一个DataFrame overview (这个问题的缩写)。

代码语言:javascript
复制
>>> import pandas as pd
>>> import numpy as np
>>>
>>> index = pd.Index(['Abbott PLC', 'Abbott, Rogahn and Bednar'], dtype='object', name='Account Name')
>>> columns = pd.MultiIndex(levels=[['total', 'quantity'], ['count', 'sum']], labels=[[0, 0, 1], [1, 0, 1]])
>>> values = np.array([[755.44,   1.  ,  19.  ], [615.6 ,   1.  ,  18.  ]])
>>> 
>>> overview = pd.DataFrame(values, columns=columns, index=index)
>>> overview
                            total       quantity
                              sum count      sum
Account Name                                    
Abbott PLC                 755.44   1.0     19.0
Abbott, Rogahn and Bednar  615.60   1.0     18.0

列名很奇怪,因为在我的实际代码中,这个结果来自具有以下分组操作的DataFrame df

代码语言:javascript
复制
aggregators = {'total': ['sum', 'count'], 'quantity': 'sum'}
overview = df.groupby('Account Name')['total', 'quantity'].agg(aggregators)

我想重命名overview的列,所需的结果如下所示:

代码语言:javascript
复制
                            gross  checkouts  items
Account Name                                       
Abbott PLC                 755.44        1.0   19.0
Abbott, Rogahn and Bednar  615.60        1.0   18.0

我不能简单地使用overview.columns = ['gross', 'checkouts', 'items']或来自这个类似的问题的答案,因为在使用agg之后,列的顺序是任意的。(应用rename似乎也很棘手,因为名称'sum'重复。)

目前,我正在使用OrderedDict for aggregators来解决这个问题,因此overview有一个确定性列代码。但是,假设overview的创建不能固定在上游,我如何才能优雅地达到我想要的结果?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-13 08:10:42

您的dataframe有一个MultiIndex作为列。有几种方法可以简化为常规索引:

pd.Index.map

代码语言:javascript
复制
overview.columns = overview.columns.map('_'.join)

列表理解+f-字符串

使用Python 3.6+,您可以使用格式化的字符串文本(佩普498):

代码语言:javascript
复制
overview.columns = [f'{i}_{j}' for i, j in overview.columns]

列表理解+ str.format / str.join

对于<3.6版本,可以使用str.formatstr.join

代码语言:javascript
复制
overview.columns = ['{i}_{j}'.format(i, j) for i, j in overview.columns]

overview.columns = list(map('_'.join, overview.columns))

要仅重命名,可以直接使用字典映射:

代码语言:javascript
复制
d = {('total', 'sum'): 'gross', ('total', 'count'): 'checkouts',
     ('quantity', 'sum'): 'items'}

overview.columns = np.vectorize(d.get)(overview.columns)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51816479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档