堆叠 MultiIndex 的所有级别
stack all levels of a MultiIndex
我有一个数据框:
index = pd.MultiIndex.from_product([['a', 'b'], ['A', 'B'], ['One', 'Two']])
df = pd.DataFrame(np.arange(16).reshape(2, 8), columns=index)
df
如何在不知道列有多少层的情况下堆叠 MultiIndex
的所有层。
我希望结果如下所示:
0 a A One 0
Two 1
B One 2
Two 3
b A One 4
Two 5
B One 6
Two 7
1 a A One 8
Two 9
B One 10
Two 11
b A One 12
Two 13
B One 14
Two 15
dtype: int64
你可以先找到len
个关卡,得到range
传给stack
:
print (df.columns.nlevels)
3
print (list(range(df.columns.nlevels)))
[0, 1, 2]
print (df.stack(list(range(df.columns.nlevels))))
0 a A One 0
Two 1
B One 2
Two 3
b A One 4
Two 5
B One 6
Two 7
1 a A One 8
Two 9
B One 10
Two 11
b A One 12
Two 13
B One 14
Two 15
dtype: int32
如果命名索引级别,则可以使用名称列表,如下所示:
index = pd.MultiIndex.from_product(
[['a', 'b'], ['A', 'B'], ['One', 'Two']],
names=['idx1', 'idx2', 'idx3']
)
df = pd.DataFrame(np.arange(16).reshape(2, 8), columns=index)
df.stack(index.names)
结果:
idx1 idx2 idx3
0 a A One 0
Two 1
B One 2
Two 3
b A One 4
Two 5
B One 6
Two 7
1 a A One 8
Two 9
B One 10
Two 11
b A One 12
Two 13
B One 14
Two 15
dtype: int64
我有一个数据框:
index = pd.MultiIndex.from_product([['a', 'b'], ['A', 'B'], ['One', 'Two']])
df = pd.DataFrame(np.arange(16).reshape(2, 8), columns=index)
df
如何在不知道列有多少层的情况下堆叠 MultiIndex
的所有层。
我希望结果如下所示:
0 a A One 0
Two 1
B One 2
Two 3
b A One 4
Two 5
B One 6
Two 7
1 a A One 8
Two 9
B One 10
Two 11
b A One 12
Two 13
B One 14
Two 15
dtype: int64
你可以先找到len
个关卡,得到range
传给stack
:
print (df.columns.nlevels)
3
print (list(range(df.columns.nlevels)))
[0, 1, 2]
print (df.stack(list(range(df.columns.nlevels))))
0 a A One 0
Two 1
B One 2
Two 3
b A One 4
Two 5
B One 6
Two 7
1 a A One 8
Two 9
B One 10
Two 11
b A One 12
Two 13
B One 14
Two 15
dtype: int32
如果命名索引级别,则可以使用名称列表,如下所示:
index = pd.MultiIndex.from_product(
[['a', 'b'], ['A', 'B'], ['One', 'Two']],
names=['idx1', 'idx2', 'idx3']
)
df = pd.DataFrame(np.arange(16).reshape(2, 8), columns=index)
df.stack(index.names)
结果:
idx1 idx2 idx3
0 a A One 0
Two 1
B One 2
Two 3
b A One 4
Two 5
B One 6
Two 7
1 a A One 8
Two 9
B One 10
Two 11
b A One 12
Two 13
B One 14
Two 15
dtype: int64