我有一个DataFrame overview (这个问题的缩写)。
>>> 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。
aggregators = {'total': ['sum', 'count'], 'quantity': 'sum'}
overview = df.groupby('Account Name')['total', 'quantity'].agg(aggregators)我想重命名overview的列,所需的结果如下所示:
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的创建不能固定在上游,我如何才能优雅地达到我想要的结果?
发布于 2018-08-13 08:10:42
您的dataframe有一个MultiIndex作为列。有几种方法可以简化为常规索引:
pd.Index.map
overview.columns = overview.columns.map('_'.join)列表理解+f-字符串
使用Python 3.6+,您可以使用格式化的字符串文本(佩普498):
overview.columns = [f'{i}_{j}' for i, j in overview.columns]列表理解+ str.format / str.join
对于<3.6版本,可以使用str.format或str.join
overview.columns = ['{i}_{j}'.format(i, j) for i, j in overview.columns]
overview.columns = list(map('_'.join, overview.columns))要仅重命名,可以直接使用字典映射:
d = {('total', 'sum'): 'gross', ('total', 'count'): 'checkouts',
('quantity', 'sum'): 'items'}
overview.columns = np.vectorize(d.get)(overview.columns)https://stackoverflow.com/questions/51816479
复制相似问题