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 透视多索引列的主要内容,如果未能解决你的问题,请参考以下文章