来自两个 data.frame 的多索引 data.frame 按列连接 headers

Multiindex data.frame from two data.frames join by column headers

这里有几十个听起来相似的问题,我想我已经搜索了所有问题,但找不到解决我问题的方法:

我有 2 个 df: df_c:

        CAN-01  CAN-02  CAN-03
CE                            
ce1     0.84     0.73     0.50
ce2     0.06     0.13     0.05

和df_z:

        CAN-01  CAN-02  CAN-03
marker                        
cell1     0.29     1.5       7
cell2     1.00     3.0       1

我想加入每个 'marker' + 'CE' 组合的列名

示例:cell1 + ce1:

[[0.29, 0.84],[1.5,0.73],[7,0.5], ...]

(继续 cell1 + ce2,cell2 + ce1,cell2 + ce2)

我有一个使用两个循环和 .loc 两次的工作示例,但它需要永远处理完整的数据集。

我认为最好的构建是具有一些 merge/join/concat 魔力的多索引 DF:

                CAN-01  CAN-02  CAN-03
     Source                            
0    CE           0.84    0.73    0.50
     Marker       0.29    1.5     7
1    CE           ...     
     Marker       ...     

示例代码

dc = [['ce1', 0.84, 0.73, 0.5],['c2', 0.06,0.13,0.05]] 
dat_c = pd.DataFrame(dc, columns=['CE', 'CAN-01', 'CAN-02', 'CAN-03']) 
dat_c.set_index('CE',inplace=True)

dz = [['cell1', 0.29, 1.5, 7],['cell2', 1, 3, 1]]
dat_z = pd.DataFrame(dz, columns=['marker', "CAN-01", "CAN-02", "CAN-03"])
dat_z.set_index('marker',inplace=True)

Bad/Slow 解决方案

for ci, c_row in dat_c.iterrows(): # for each CE in CE table

    tmp = []

    for j,colz in enumerate(dat_z.columns[1:]):

        if not colz in dat_c:
            continue
        entry_c = c_row.loc[colz]
    
        if len(entry_c.shape) > 0:
            continue
        
        tmp.append([dat_z.loc[marker,colz],entry_c])

IIUC:

使用append()+groupby():

dat_c.index=[f"cell{x+1}" for x in range(len(dat_c))]
df=dat_c.append(dat_z).groupby(level=0).agg(list)

df 的输出:

         CAN-01         CAN-02          CAN-03
cell1   [0.84, 0.29]    [0.73, 1.5]     [0.5, 7.0]
cell2   [0.06, 1.0]     [0.13, 3.0]     [0.05, 1.0]

如果需要列表:

dat_c.index=[f"cell{x+1}" for x in range(len(dat_c))]
lst=dat_c.append(dat_z).groupby(level=0).agg(list).to_numpy().tolist()

lst 的输出:

[[[0.84, 0.29], [0.73, 1.5], [0.5, 7.0]],
 [[0.06, 1.0], [0.13, 3.0], [0.05, 1.0]]]