pandas 透视多索引列

Posted

技术标签:

【中文标题】pandas 透视多索引列【英文标题】:pandas pivot multi-indexed columns 【发布时间】:2020-08-31 09:33:55 【问题描述】:

我想转置一个多索引数据名,但失败了:

 Shape of passed values is (3, 4), indices imply (3, 2)

代码:

import pandas as pd

df = pd.DataFrame(
    'foo': [1,2,3], 'bar':[4,5,6], 'dt':['2020-01-01', '2020-01-01', '2020-01-02'], 'cat':['a', 'b', 'b']
)
df = df.groupby(['dt', 'cat']).describe().loc[:, pd.IndexSlice[:, ['count', '50%']]].reset_index()
columns_of_interest = sorted(df.drop(['dt', 'cat'], axis=1, level=0).columns.get_level_values(0).unique())
df.pivot(index='dt', columns='cat', values=columns_of_interest)

如何解决?

编辑

预期结果:

来自:

dt  cat     foo     bar
            count   50%     count   50%
0   2020-01-01  a   1.0     1.0     1.0     4.0
1   2020-01-01  b   1.0     2.0     1.0     5.0
2   2020-01-02  b   1.0     3.0     1.0     6.0

到:

value       foo         bar

cat     a       b       a       b
dt

0
1
2

编辑 2

基本上我想计算:

v = 'count'
df['foo'][v].reset_index().pivot(index='dt', columns='cat', values = v)

对于每个列 [foo, bar] 和每个聚合 [count, 50%] 并返回单个组合结果。

即:

for c in columns_of_interest:
    print(c)    
    for piv in piv_values:
        print(piv)
        r = df[c][piv].reset_index().pivot(index='dt', columns='cat', values = piv)
        display(r)

1) 我只是不确定如何重新组合结果,以及 2) 如何找到一个简洁的解决方案。

解决方法

一个相当巧妙的解决方法是使关卡变平:

df.columns = ['_'.join(col).strip() for col in df.columns.values]
columns_of_interest = df.columns
df.reset_index().pivot(index='dt', columns='cat', values=columns_of_interest)

【问题讨论】:

有很多方法可以“解决”这个问题。我们必须知道您的期望。 天真的我会说三重索引。 【参考方案1】:

IIUC,你可以在groupby之后使用unstack(没有reset_index):

df = pd.DataFrame(
    'foo': [1,2,3], 'bar':[4,5,6], 
    'dt':['2020-01-01', '2020-01-01', '2020-01-02'], 'cat':['a', 'b', 'b']
)
df_ = df.groupby(['dt', 'cat']).describe()\
        .loc[:, pd.IndexSlice[:, ['count', '50%']]]\
        .unstack() # unstack instead of reset_index

print (df_)
             foo                  bar               
           count       50%      count       50%     
cat            a    b    a    b     a    b    a    b
dt                                                  
2020-01-01   1.0  1.0  1.0  2.0   1.0  1.0  4.0  5.0
2020-01-02   NaN  1.0  NaN  3.0   NaN  1.0  NaN  6.0

【讨论】:

以上是关于pandas 透视多索引列的主要内容,如果未能解决你的问题,请参考以下文章

具有多索引的 Pandas 数据透视表小计

对多索引数据透视表 pandas 进行排序

结合 pandas 数据透视表多索引标题 - 一个时间戳,一个字符串

pandas:如何使用多索引运行数据透视?

使用 pandas 连接多索引列

具有多索引列的 Pandas groupby