在 pandas 中连接索引和键

Concatenating on index and key in pandas

我不确定我是否正确使用了这些术语,因为我对 pandas 和 python 还很陌生。但是,我想将两个数据框合二为一。它们可以在索引列和其他键列(示例)上匹配。 'sample' 范围从 001 到 100,每个样本的索引从 1 到 729。

df1

    sample  x1  x2  x3  x4
id                  
1   068 421.67  0.34    0.71    0.928
2   068 28.77   0.07    0.81    0.952
3   068 4.01    0.36    0.70    0.925
4   068 41.07   0.32    0.70    0.924

df2

    q1  q2  q3  q4  q5  q6  sample
id                                                                                  
1   a1  a2  r1  r2  c1  c2  068
2   a1  a2  r1  r2  c1  c4  068
3   a1  a2  r1  r2  c1  c5  068
4   a1  a2  r1  r2  c3  c2  068

结果

    sample x1       x2      x3      x4     q1   q2  q3  q4  q5  q6  
id                  
1   068   41.967    0.34    0.71    0.928  a1   a2  r1  r2  c1  c2  
2   068   28.77     0.07    0.81    0.952  a1   a2  r1  r2  c1  c4  
3   068   4.01      0.36    0.70    0.925  a1   a2  r1  r2  c1  c5  
4   068   41.07     0.32    0.70    0.924  a1   a2  r1  r2  c3  c2  

您可以对 idsample 列上的那 2 个数据帧使用 merge。然后重命名列,如果你希望它们是 q1, q2 ...:[=​​17=]

In [33]: pd.merge(df1, df2, on=['id', 'sample'])
Out[33]:
   id  sample      x1    x2    x3     x4  a1  a2  r1  r2  c1  c2
0   1      68  421.67  0.34  0.71  0.928  a1  a2  r1  r2  c1  c2
1   2      68   28.77  0.07  0.81  0.952  a1  a2  r1  r2  c1  c4
2   3      68    4.01  0.36  0.70  0.925  a1  a2  r1  r2  c1  c5
3   4      68   41.07  0.32  0.70  0.924  a1  a2  r1  r2  c3  c2

如果要更改列名:

df3 = pd.merge(df1, df2, on=['id', 'sample'])
df3.columns = df3.columns[:-6].tolist() + ['q1', 'q2', 'q3', 'q4', 'q5', 'q6']

In [50]: df3
Out[50]:
   id  sample      x1    x2    x3     x4  q1  q2  q3  q4  q5  q6
0   1      68  421.67  0.34  0.71  0.928  a1  a2  r1  r2  c1  c2
1   2      68   28.77  0.07  0.81  0.952  a1  a2  r1  r2  c1  c4
2   3      68    4.01  0.36  0.70  0.925  a1  a2  r1  r2  c1  c5
3   4      68   41.07  0.32  0.70  0.924  a1  a2  r1  r2  c3  c2

编辑

您可以为列名创建序列(如果您有很多):

In [87]: ['q' + str(num) for num in range(1,7)]
Out[87]: ['q1', 'q2', 'q3', 'q4', 'q5', 'q6']