我有一个多索引数据框,其名称附加到列级别。数据表如下所示:(df1)
TIME TMC 111N1 111P2 111N3 111P4 DATE EPOCH 0 143 113 103 NaN 1 183 NaN NaN NaN 2 NaN NaN NaN NaN 3 143 NaN NaN NaN
我想随机排列列,使它们与参考数据框(df2)的行索引指定的顺序相匹配:
A1 A2 A3 A4 A5 Name 111N3 PA PL er 0.75543 35 111P4 PA PL er 0.09413 35 111N1 PA PL er 4.21557 35 111P2 PA PL er 1.31989 35
即结果应该是(df3):
TIME TMC 111N3 111P4 111N1 111P2 DATE EPOCH 0 103 NaN 143 113 1 NaN NaN 183 NaN 2 NaN NaN NaN NaN 3 NaN NaN 143 NaN
要根据参考数据框(df2)的行索引重新排列 df1 的列,我们可以按照以下步骤进行:
df2
df1
TMC
具体代码如下:
import pandas as pd import numpy as np # 创建示例 df1 df1 = pd.DataFrame({ ('TIME', 'TMC'): [0, 1, 2, 3], ('TIME', '111N1'): [143, 183, np.nan, 143], ('TIME', '111P2'): [113, np.nan, np.nan, np.nan], ('TIME', '111N3'): [103, np.nan, np.nan, np.nan], ('TIME', '111P4'): [np.nan, np.nan, np.nan, np.nan] }).set_index([('DATE', 'EPOCH')]) # 创建示例 df2 df2 = pd.DataFrame({ 'A1': ['PA', 'PA', 'PA', 'PA'], 'A2': ['PL', 'PL', 'PL', 'PL'], 'A3': ['er', 'er', 'er', 'er'], 'A4': [0.75543, 0.09413, 4.21557, 1.31989], 'A5': [35, 35, 35, 35] }, index=['111N3', '111P4', '111N1', '111P2']) # 获取 df2 中的索引顺序 df2_order = df2.index # 根据 df2 的行索引顺序重新排列 df1 的列(去掉 TIME 和 TMC 元组层级) df1_reordered = df1['TIME'][df2_order] # 输出结果 print(df1_reordered)
df2_order = df2.index 会返回 df2 的索引,这就是列排序的依据。
df2_order = df2.index
根据 df2 索引重新排列 df1 的列:
df1['TIME'][df2_order] 会按照 df2 的索引顺序重新排列 df1 的列。注意,这里假设 df1 和 df2 的列名(如 111N1, 111P2 等)是匹配的。
df1['TIME'][df2_order]
111N1
111P2
输出排序后的 df1:
df1_reordered
这样,df1 就会按照 df2 中的 TMC 顺序进行列重新排列,得到了你所期望的结果。