Kri*_*Eng 4 python format dataframe pandas
我有一个带有两个 MultiIndexes 的数据框(我理解为“宽格式”),我想重塑它,以便第二个索引成为一个新列(我理解为“长格式”)。有什么简单的方法可以做到这一点吗?
这是现在的数据框:
A = pd.DataFrame([[1, 2], [1, 2], [1, 2], [1, 2], [1, 2]],
columns=['h', 'k'], index=[1, 2, 3, 4, 5])
B = pd.DataFrame([[3, 4], [3, 4], [3, 4], [3, 4], [3, 4]],
columns=['h', 'k'], index=[1, 2, 3, 4, 5])
C = pd.DataFrame([[5, 6], [5, 6], [5, 6], [5, 6], [5, 6]],
columns=['h', 'k'], index=[1, 2, 3, 4, 5])
A.columns = pd.MultiIndex.from_product([['A'], A.columns])
B.columns = pd.MultiIndex.from_product([['B'], B.columns])
C.columns = pd.MultiIndex.from_product([['C'], C.columns])
ABC = pd.concat([A, B, C], axis = 1)
Run Code Online (Sandbox Code Playgroud)
A B C
h k h k h k
1 1 2 3 4 5 6
2 1 2 3 4 5 6
3 1 2 3 4 5 6
4 1 2 3 4 5 6
5 1 2 3 4 5 6
Run Code Online (Sandbox Code Playgroud)
这就是我想要实现的目标:
A B C new_col
1 1 3 5 h
2 1 3 5 h
3 1 3 5 h
4 1 3 5 h
5 1 3 5 h
1 2 4 6 k
2 2 4 6 k
3 2 4 6 k
4 2 4 6 k
5 2 4 6 k
Run Code Online (Sandbox Code Playgroud)
(我希望能够直接在数据帧上执行此操作,而不必将其转换为另一个对象,例如 numpy 数组,以避免性能下降)。
尝试:
print(
ABC.stack(level=1)
.reset_index(1)
.rename(columns={"level_1": "new_col"})
.sort_values("new_col")
)
Run Code Online (Sandbox Code Playgroud)
印刷:
new_col A B C
1 h 1 3 5
2 h 1 3 5
3 h 1 3 5
4 h 1 3 5
5 h 1 3 5
1 k 2 4 6
2 k 2 4 6
3 k 2 4 6
4 k 2 4 6
5 k 2 4 6
Run Code Online (Sandbox Code Playgroud)