pandas pivot多索引列。

问题描述 投票:1回答:1

我想对一个多索引的数据名进行pivot,但失败了。

 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)
python pandas pivot multi-index
1个回答
1
投票

在IIUC中,你可以使用 unstack 之后 groupby (无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
© www.soinside.com 2019 - 2024. All rights reserved.