将多索引与多个列级别和数据帧合并

时间:2017-11-08 05:29:20

标签: python pandas dataframe multi-index

假设我有一个多索引input{ jdbc{ jdbc_connection_string=>"hostname" jdbc_user=>"user" jdbc_password=>"password" jdbc_driver_library=>"path/to/library" jdbc_driver_class=>"com.mysql.jdbc.Driver" lowercase_column_names => "false" statement_filepath => "query.sql" } } ,如下所示:

mi

A和B是两部分,因此multiindex包含有关两个部分的多个实例的序列号和构建日期的信息。

我有一个数据框 Serial No. Date A B A B 0 816292 934609 27/01/17 27/01/17 1 983803 683858 25/01/17 26/01/17 2 596573 493741 27/01/17 28/01/17 3 199203 803515 28/01/17 28/01/17 ,其中包含A部分的测试信息,如下所示:

df

我希望能够合并这两个并产生类似

的东西
        A    Test 1    Test 2    Test 3      
0  816292  0.934609  0.475035  0.822712
1  983803  0.683858  0.025861  0.691112
2  596573  0.493741  0.397398  0.489101
3  199203  0.803515  0.679537  0.308588

我最初的尝试是

        Serial No.               Date                         Tests
        A       B         A         B    Test 1    Test 2    Test 3
0  816292  934609  27/01/17  27/01/17  0.934609  0.475035  0.822712
1  983803  683858  25/01/17  26/01/17  0.683858  0.025861  0.691112
2  596573  493741  27/01/17  28/01/17  0.493741  0.397398  0.489101
3  199203  803515  28/01/17  28/01/17  0.803515  0.679537  0.308588

但是会产生mi = mi.merge(df,left_on=('Serial No.','A'),right_on='A',how='inner') 。我尝试将其他列索引ValueError: len(right_on) must equal len(left_on)添加到'Tests',然后执行

df

但产生mi = mi.merge(df,left_on=('Serial No.','A'),right_on=('Tests','A'),how='inner')

2 个答案:

答案 0 :(得分:2)

最简单的方法是修复df的列以匹配mi

In [11]: df
Out[11]:
        A    Test 1    Test 2    Test 3
0  816292  0.934609  0.475035  0.822712
1  983803  0.683858  0.025861  0.691112
2  596573  0.493741  0.397398  0.489101
3  199203  0.803515  0.679537  0.308588

In [12]: df.columns = pd.MultiIndex.from_arrays([["Serial No.", "Test", "Test", "Test"], df.columns])

In [13]: df
Out[13]:
  Serial No.      Test
           A    Test 1    Test 2    Test 3
0     816292  0.934609  0.475035  0.822712
1     983803  0.683858  0.025861  0.691112
2     596573  0.493741  0.397398  0.489101
3     199203  0.803515  0.679537  0.308588

然后合并将“正常工作”:

In [14]: df.merge(mi)
Out[14]:
  Serial No.      Test                     Serial No.      Date
           A    Test 1    Test 2    Test 3          B         A         B
0     816292  0.934609  0.475035  0.822712     934609  27/01/17  27/01/17
1     983803  0.683858  0.025861  0.691112     683858  25/01/17  26/01/17
2     596573  0.493741  0.397398  0.489101     493741  27/01/17  28/01/17
3     199203  0.803515  0.679537  0.308588     803515  28/01/17  28/01/17

有很多方法可以创建MultiIndex的顶级,在这里我只写了清单:

["Serial No.", "Test", "Test", "Test"]

手工......但你可以生成:它只是一个列表。

答案 1 :(得分:1)

mi.set_index(('Serial No.', 'A')).join(
    pd.concat([df.set_index('A')], axis=1, keys=['Tests'])
).reset_index()

  Serial No.              Date               Tests                    
           A       B         A         B    Test 1    Test 2    Test 3
0     816292  934609  27/01/17  27/01/17  0.934609  0.475035  0.822712
1     983803  683858  25/01/17  26/01/17  0.683858  0.025861  0.691112
2     596573  493741  27/01/17  28/01/17  0.493741  0.397398  0.489101
3     199203  803515  28/01/17  28/01/17  0.803515  0.679537  0.308588