将列级别连接到现有的多列Pandas数据框架

nbysray5  于 2023-08-01  发布在  其他
关注(0)|答案(2)|浏览(74)

我有两个带有多列索引的数据框架。两个 Dataframe 的列数完全相同。

import pandas as pd

columns_df1 = pd.MultiIndex.from_tuples([
    ('A', 1, 'X', 'Y', 'Z'),
    ('B', 2, 'X', 'Y', 'Z'),
    ('C', 3, 'X', 'Y', 'Z')
], names=['level1', 'level2', 'level3', 'level4', 'level5'])

df1 = pd.DataFrame([[1, 2, 3]], columns=columns_df1)

columns_df2 = pd.MultiIndex.from_tuples([
    ('D', 4, 'P', 'Q', 'R'),
    ('E', 5, 'P', 'Q', 'R'),
    ('F', 6, 'P', 'Q', 'R')
], names=['level6', 'level7', 'level8', 'level9', 'level10'])

df2 = pd.DataFrame([[4, 5, 6]], columns=columns_df2)

print(df1)

print(df2)

level1  A  B  C
level2  1  2  3
level3  X  X  X
level4  Y  Y  Y
level5  Z  Z  Z
0       1  2  3

level6   D  E  F
level7   4  5  6
level8   P  P  P
level9   Q  Q  Q
level10  R  R  R
0        4  5  6

字符串
我需要将df2的最后两列级别(level9和level10)添加到df1。最好的办法是什么?
预期结果:

level1  A  B  C
level2  1  2  3
level3  X  X  X
level4  Y  Y  Y
level5  Z  Z  Z
level9  Q  Q  Q
level10 R  R  R
0       1  2  3

56lgkhnf

56lgkhnf1#

一种方法是将两个索引压缩在一起:

last = 2
names = df1.columns.names.union(df2.columns.names[-last:])

df1.set_axis(pd.MultiIndex.from_tuples([i1 + i2[-last:] for i1,i2 in list(zip(df1.columns,df2.columns))],names = names),axis=1)

字符串
输出量:

level1   A  B  C
level2   1  2  3
level3   X  X  X
level4   Y  Y  Y
level5   Z  Z  Z
level9   Q  Q  Q
level10  R  R  R
0        1  2  3

ui7jx7zq

ui7jx7zq2#

使用DataFrames作为pandas.MultiIndex.to_frame/from_frameconcat的中间体:

new_idx = pd.MultiIndex.from_frame(pd.concat([df1.columns.to_frame(index=False),
                                              df2.columns.to_frame(index=False).iloc[:, -2:],
                                             ], axis=1))

out = df1.set_axis(new_idx, axis=1)

字符串
输出量:

level1   A  B  C
level2   1  2  3
level3   X  X  X
level4   Y  Y  Y
level5   Z  Z  Z
level9   Q  Q  Q
level10  R  R  R
0        1  2  3

相关问题