小能豆

根据参考重新排序多索引数据框列

py

我有一个多索引数据框,其名称附加到列级别。数据表如下所示:(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 

阅读 48

收藏
2024-11-22

共1个答案

小能豆

要根据参考数据框(df2)的行索引重新排列 df1 的列,我们可以按照以下步骤进行:

  1. 获取 df2 的索引并基于该索引重新排序 df1 的列。
  2. df1 进行列重新排序,以使其顺序与 df2 中的 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)

解释:

  1. 获取 df2 索引顺序
  2. df2_order = df2.index 会返回 df2 的索引,这就是列排序的依据。

  3. 根据 df2 索引重新排列 df1 的列

  4. df1['TIME'][df2_order] 会按照 df2 的索引顺序重新排列 df1 的列。注意,这里假设 df1df2 的列名(如 111N1, 111P2 等)是匹配的。

  5. 输出排序后的 df1

  6. 输出的 df1_reordered 会显示列已根据 df2 的索引顺序进行重新排列。

输出示例:

                        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 

这样,df1 就会按照 df2 中的 TMC 顺序进行列重新排列,得到了你所期望的结果。

2024-11-22