Programming for trading

[Python] 데이터프레임 차집합 구하기

quantoasis 2022. 12. 30. 14:04
반응형

 

 

 

데이터프레임을 다루다보면 두 데이터프레임간의 차집합을 구해야 할 때가 있습니다.

 

reference : 네이버 지식백과

 

예를 들어 데이터베이스 테이블에 존재하는 데이터와 웹에서 크롤링한 데이터간의 차집합을 구해서 비어있는 값을 insert하는 경우가 있겠습니다. 중복키 에러를 피하기 위해서 입니다.

 

리스트에서는 set이라는 함수가 있어서 차집합을 쉽게 구할 수 있는데, 데이터프레임에서 구현하기엔 쉽지 않더라구요.

 

데이터프레임의 merge기능을 이용하여 두 데이터 프레임 간 key값을 조인한 뒤, 한쪽에 있는 데이터만 가져와 주면 쉽게 차집합을 구할 수 있습니다.

 

예제와 함께 진행해보겠습니다.

 

data1_20220926.csv
4.18MB
data2_20220926.csv
4.03MB

 

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

columns =['date','time','open','high','low','close','volume','amount']
data1 = pd.read_csv('data1_20220926.csv', 
                 sep=',', names=columns,
                 parse_dates = True, header=None)
data2 = pd.read_csv('data2_20220926.csv', 
                 sep=',', names=columns,
                 parse_dates = True, header=None)

data1과 data2 두개의 주가데이터 데이터프레임이 있습니다.

 

info함수로 데이터 수를 확인해보면 data1은 70760개, data2는 71756개가 있네요.

 

data2에서 data1에 있는 데이터만 빼려면 아래와 같이 코드를 작성하면 됩니다.

 

#merge함수로 데이터프레임을 합친뒤 left인 행만 추출
df_set_diff = data2.merge(data1, how = 'outer',on =['date','time'] ,indicator=True).loc[lambda x : x['_merge']=='left_only']

 

풀어서 쓰면 key값인 date와 time을 이용해서 두 데이터프레임을 붙인 후 indicator 중 _merge가 left_only인 행만 가져온 것입니다(indicator를 True로 설정하면 데이터의 출처가 left인지 right인지 both인지 _merge컬럼에 나타나게 됩니다.).

 

df_set_diff를 출력해보면 위와 같이 data2에만 있는 데이터행만 남아있다는 것을 알 수 있습니다.

 

이제 필요없는 컬럼을 날리고, 컬럼명을 다시 원래대로 복구시키면 될 것 같은데요

 

아래 코드를 실행하면 깔끔하게 차집합만 남습니다.

 

#df_set_diff에 0부터 8번째 컬럼데이터만 가져온 후, 컬럼명을 data2 컬럼으로 변경
df_set_diff = df_set_diff[df_set_diff.columns[0:8]]
df_set_diff.columns = data2.columns

 

 

이번 포스팅은 여기까집니다.

 

감사합니다.

 

반응형