在groupby-aggregate中使用多个函数会产生一个多索引,然后我想要展平。
示例:
df = pd.DataFrame(
{'A': [1,1,1,2,2,2,3,3,3],
'B': np.random.random(9),
'C': np.random.random(9)}
)
out = df.groupby('A').agg({'B': [np.mean, np.std], 'C': np.median})
# example output
B C
mean std median
A
1 0.791846 0.091657 0.394167
2 0.156290 0.202142 0.453871
3 0.482282 0.382391 0.892514
目前,我这样手动执行
out.columns = ['B_mean', 'B_std', 'C_median']
给了我想要的结果
B_mean B_std C_median
A
1 0.791846 0.091657 0.394167
2 0.156290 0.202142 0.453871
3 0.482282 0.382391 0.892514
但是我正在寻找一种自动执行此过程的方法,因为这是单调的,耗时的,并允许我在重命名列时进行拼写错误。
有没有办法在进行groupby-aggregate时返回扁平索引而不是多索引?
我需要将列展平以保存到文本文件,然后由不能处理多索引列的其他程序读取。
答案 0 :(得分:9)
您可以使用列
执行map
join
out.columns = out.columns.map('_'.join)
out
Out[23]:
B_mean B_std C_median
A
1 0.204825 0.169408 0.926347
2 0.362184 0.404272 0.224119
3 0.533502 0.380614 0.218105
出于某种原因(当列包含int时)我更喜欢这种方式
out.columns.map('{0[0]}_{0[1]}'.format)
Out[27]: Index(['B_mean', 'B_std', 'C_median'], dtype='object')
答案 1 :(得分:3)
从0.24.0版本开始,您只能使用 to_flat_index 。
out.columns = [f"{x}_{y}" for x, y in out.columns.to_flat_index()]
B_mean B_std C_median
A
1 0.779592 0.137168 0.583211
2 0.158010 0.229234 0.550383
3 0.186771 0.150575 0.313409
答案 2 :(得分:1)
您可以使用:
out.columns = list(map('_'.join, out.columns.values))
答案 3 :(得分:0)
以其他答案为基础:如果在第二级中未对其中一列进行命名,则会在列名称后加上反斜杠(例如D_
)。
为防止这种情况,请使用lambda函数:
out.columns = out.columns.map(lambda x: '_'.join(a for a in x if len(a)>0))