将多索引与多个列级别和数据框合并
Merge multiindex with multiple column levels and dataframe
假设我有一个多索引 mi
如下:
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 和 B 是两个部分,因此 multiindex 包含有关两个部分的多个实例的序列号和构建日期的信息。
我有一个包含 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')
但这会产生 KeyError: 'A'
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
最简单的方法是修复 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
然后合并将 "just work":
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"]
手动...但您可以生成:它只是一个列表。
假设我有一个多索引 mi
如下:
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 和 B 是两个部分,因此 multiindex 包含有关两个部分的多个实例的序列号和构建日期的信息。
我有一个包含 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')
但这会产生 KeyError: 'A'
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
最简单的方法是修复 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
然后合并将 "just work":
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"]
手动...但您可以生成:它只是一个列表。