【发布时间】: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)
【问题讨论】:
-
有很多方法可以“解决”这个问题。我们必须知道您的期望。
-
天真的我会说三重索引。
标签: python pandas pivot multi-index