Python Library/Pandas

[Pandas - Python] Merging on Index - merge(), join()

바보1 2022. 6. 15. 21:22

만약 column을 기준으로 합치려고 하는데, 합치려고 하는 컬럼이 인덱스에 있다면 어떻게 해야할까요? 

 

우선 두 개의 데이터 프레임을 만들었습니다.

left1 = pd.DataFrame({'key': ['a', 'b', 'a', 'a', 'b', 'c'],
                      'value': range(6)})
right1 = pd.DataFrame({'group_val': [3.5, 7]}, index=['a', 'b'])

left1

	key	value
0	a	0
1	b	1
2	a	2
3	a	3
4	b	4
5	c	5
right1

	group_val
a	3.5
b	7.0

이때 right1의 인덱스에 a,b라는 key가 들어가있습니다.

이를 해결하기 위해서는 right_index = True를 해주면 됩니다.

pd.merge(left1, right1, left_on='key', right_index=True)

	key	value	group_val
0	a	0	3.5
2	a	2	3.5
3	a	3	3.5
1	b	1	7.0
4	b	4	7.0

또한 합집합도 가능합니다.

pd.merge(left1, right1, left_on='key', right_index=True, how='outer')

	key	value	group_val
0	a	0	3.5
2	a	2	3.5
3	a	3	3.5
1	b	1	7.0
4	b	4	7.0
5	c	5	NaN

다시 새로운 데이터를 만들어 봅시다.

lefth = pd.DataFrame({'key1': ['Ohio', 'Ohio', 'Ohio',
                               'Nevada', 'Nevada'],
                      'key2': [2000, 2001, 2002, 2001, 2002],
                      'data': np.arange(5.)})
righth = pd.DataFrame(np.arange(12).reshape((6, 2)),
                      index=[['Nevada', 'Nevada', 'Ohio', 'Ohio',
                              'Ohio', 'Ohio'],
                             [2001, 2000, 2000, 2000, 2001, 2002]],
                      columns=['event1', 'event2'])
lefth

	key1	key2	data
0	Ohio	2000	0.0
1	Ohio	2001	1.0
2	Ohio	2002	2.0
3	Nevada	2001	3.0
4	Nevada	2002	4.0

 

righth

		event1	event2
Nevada	2001	0	1
        2000	2	3
Ohio	2000	4	5
        2000	6	7
        2001	8	9
        2002	10	11

 

이때는 한 번 key1, key2를 가지고 병합해봅시다.

pd.merge(lefth, righth, left_on=['key1', 'key2'], right_index=True)

	key1	key2	data	event1	event2
0	Ohio	2000	0.0	4	5
0	Ohio	2000	0.0	6	7
1	Ohio	2001	1.0	8	9
2	Ohio	2002	2.0	10	11
3	Nevada	2001	3.0	0	1

간단하네요

 

합집합도 가능합니다.

pd.merge(lefth, righth, left_on=['key1', 'key2'],
         right_index=True, how='outer')
         
         key1	key2	data	event1	event2
0	Ohio	2000	0.0	4.0	5.0
0	Ohio	2000	0.0	6.0	7.0
1	Ohio	2001	1.0	8.0	9.0
2	Ohio	2002	2.0	10.0	11.0
3	Nevada	2001	3.0	0.0	1.0
4	Nevada	2002	4.0	NaN	NaN
4	Nevada	2000	NaN	2.0	3.0

 

다시 새로운 데이터 프레임을 만들어서 테스트 해봅시다.

left2 = pd.DataFrame([[1., 2.], [3., 4.], [5., 6.]],
                     index=['a', 'c', 'e'],
                     columns=['Ohio', 'Nevada'])
right2 = pd.DataFrame([[7., 8.], [9., 10.], [11., 12.], [13, 14]],
                      index=['b', 'c', 'd', 'e'],
                      columns=['Missouri', 'Alabama'])
left2

	Ohio	Nevada
a	1.0	2.0
c	3.0	4.0
e	5.0	6.0
right2

	Missouri	Alabama
b	7.0	8.0
c	9.0	10.0
d	11.0	12.0
e	13.0	14.0

합집합으로 하되, 두 개 데이터 프레임 모두 인덱스가 겹치네요

 

이럴땐 left_index, right-index = True를 해주면 됩니다.

pd.merge(left2, right2, how='outer', left_index=True, right_index=True)

	Ohio	Nevada	Missouri	Alabama
a	1.0	2.0	NaN	NaN
b	NaN	NaN	7.0	8.0
c	3.0	4.0	9.0	10.0
d	NaN	NaN	11.0	12.0
e	5.0	6.0	13.0	14.0

Join()

 

 

join은 데이터 프레임의 메소드입니다.

 

일일이 right_index = True를 하는 것보다 join함수를 사용하는게 더 편합니다.

참고로 기본값은 교집합이며, 인덱스를 기준으로 합칩니다.

left2.join(right2, how='outer')

	Ohio	Nevada	Missouri	Alabama
a	1.0	2.0	NaN	NaN
b	NaN	NaN	7.0	8.0
c	3.0	4.0	9.0	10.0
d	NaN	NaN	11.0	12.0
e	5.0	6.0	13.0	14.0

위의 left1, right1을 기준으로 합칠 때, key column을 기준으로도 합칠 수 있습니다.

 

이때 알아서 left의 key에 해당하는 데이터를 right의 인덱스에서 참조하는 모습을 볼 수 있습니다.

left1.join(right1, on='key')

	key	value	group_val
0	a	0	3.5
1	b	1	7.0
2	a	2	3.5
3	a	3	3.5
4	b	4	7.0
5	c	5	NaN