在 Pandas DataFrame 中转置选定的 MultiIndex 级别
Posted
技术标签:
【中文标题】在 Pandas DataFrame 中转置选定的 MultiIndex 级别【英文标题】:Transposing selected MultiIndex levels in Pandas DataFrame 【发布时间】:2019-03-05 02:49:09 【问题描述】:我有一个 MultiIndexed DataFrame:
import pandas as pd
import numpy as np
l0, l1 = ['A', 'B'],['a', 'b']
c0 = ['c1', 'c2', 'c3']
data = np.arange(12).reshape(4,3)
df = pd.DataFrame(data=data,
index=pd.MultiIndex.from_product([l0,l1]),
columns=c0)
>>>
c1 c2 c3
A a 0 1 2
b 3 4 5
B a 6 7 8
b 9 10 11
我想转置 MultiIndex 和列的级别,以便得到:
df2 = pd.DataFrame(index=pd.MultiIndex.from_product([l0, c0]),
columns=l1)
>>>
a b
A c1 NaN NaN
c2 NaN NaN
c3 NaN NaN
B c1 NaN NaN
c2 NaN NaN
c3 NaN NaN
显然我想填充正确的值。我的解决方案目前是使用带有迭代器的 map,但感觉 Pandas 会有一些本地方式来做到这一点。我是对的,有没有更好(更快)的方法?
from itertools import product
def f(df, df2, idx_1, col_0):
df2.loc[(slice(None), col_0), idx_1] = \
df.loc[(slice(None), idx_1), col_0].values
m = map(lambda k: f(df, df2, k[0], k[1]), product(l1, c0))
list(m) # <- to execute
>>> df2
>>>
a b
A c1 0 3
c2 1 4
c3 2 5
B c1 6 9
c2 7 10
c3 8 11
【问题讨论】:
【参考方案1】:先堆叠列,然后将要成为新列的层级拆开:
df.stack().unstack(level=1)
Out:
a b
A c1 0 3
c2 1 4
c3 2 5
B c1 6 9
c2 7 10
c3 8 11
【讨论】:
以上是关于在 Pandas DataFrame 中转置选定的 MultiIndex 级别的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 python 在 Spark 中转置 DataFrame 而不进行聚合
使用scala在Spark中转置DataFrame而不进行聚合
pandas - 如何仅将 DataFrame 的选定列保存到 HDF5