본문 바로가기

배우기/복습노트[Python과 분석]

[복습] Python 집합연산자(union, intersection, difference, np.union1d, np.intersect1d, np.setdiff1d, pd.merge)

728x90
반응형

파이썬에서의 집합연산자를 살펴보자.

 

 

테스트를 위하여 위와 같은 데이터프레임을 만들어두었다.

 

 

이 결과는 union all 결과와 같다.

 

 

이 결과는 union 결과와 같다.

 

데이터프레임에서는 union, union all에 대한 메서드나 함수가 없기 때문에 위와 같은 방법을 써야 한다.

 

 

 

1. index object

위의 두 데이터프레임으로 테스트를 해보겠다.

index를 변수에 저장한다.

 

 

합집합: union

중복을 제거하며, union all이 아닌 union이 리턴된다.

index object에서 제공하는 메서드에는 union all은 없다.

 

 

교집합: intersection

 

 

차집합: difference

차집합은 순서가 중요하다. A-B, B-A가 결과가 다르기 때문이다.

 

 

 

 

 

2. numpy 집합연산자 함수

  - 함수이기 때문에 어떤 객체든지 집합연산이 가능

  - 1차원만 가능

 

 

합집합: np.union1d

중복을 제거한다. 여기서도 union all은 제공하지 않는다.

 

1차원이면 어떠한 데이터 객체든지 집합연산이 가능하므로 리스트도 가능하다.

 

 

교집합: np.intersect1d

 

 

차집합: np.setdiff1d

 

 

 

 

3. 2차원 데이터프레임에서의 집합 연산자

  -  2차원 데이터프레임에서의 집합연산자는 제공하지 않음

 

그러나 concat, drop_duplicates 기능을 적절히 사용하면 union, union all을 구현할 수 있다.

 

 

합집합) emp_10, emp_1020을 구현하여라.

먼저 union all은 다음과 같다.

 

 

union은 다음과 같다.

 

 

 

교집합) emp_10, emp_1020 구현하여라.

natural join을 하여 교집합과 같은 결과를 유도하였다.

 

 

 

차집합 1) emp_1020, emp_10 구현하여라.

먼저 pd.concat으로 10, 10, 20, 이렇게 결합을 한다. 한 후 drop_duplicates 메서드로 10을 다 제거하면 되겠다.

그런데 10이 아직 남아있다. 이는 중복된 값 중 하나만 남기고 drop 시켰기 때문이다. 중복값을 모두 제거하겠다면 keep 옵션을 False로 주면 다음과 같이 DEPTNO가 20만 남게 된다.

 

 

 

merge로도 해결할 수 있다.

먼저 pd.merge후 full outer join을 수행한 후에 indicator 옵션을 True로 켜면 _merge 컬럼이 생성되는데, 왼쪽 데이터프레임에만 있는지, 아니면 양측 데이터프레임에 존재하는지도 알려주는 컬럼이다.

여기서 left_only만 추출해내면 차집합과 같은 효과를 가질 수 있다.

 

pd.merge(emp_1020, emp_10, how = 'outer', indicator = True).query('_merge == "left_only"')

 

 

 

차집합2) emp_2030, emp_1020

이 결과는 최종적으로 DEPTNO가 30만 남게 된다.

 

위와같이 하면 20만 제거가 된다.

그런데 10번 부서를 한번 더 넣어주게 되면 10번 부서가 중복이 되면서 keep = False 옵션에 의하여 전체가 사라지기 때문이다.

 

이렇게 생각해 낼 줄도 알아야겠다.

 

 

pd.merge로도 풀어보자.

pd.merge(emp_2030, emp_1020 , how = 'outer', indicator = True).query('_merge == "left_only"')

 

 

반응형

 

 

연습문제

gogak.csv, blacklist.csv 파일을 읽고 각 고객의 가용 포인트 기준 사은품 전달 행사를 하려고 한다. 블랙리스트 고객을 제외하여라.

데이터는 아래와 같다.

 

 

 

 

1) 차집합

제거라는 개념보다는 차집합으로 접근

 

 

2) in 연산자

 

 

 

3) merge

pd.merge(gogak, blacklist, how = 'outer', indicator = True).query('_merge == "left_only"')

 

 

 

https://metime.tistory.com/78

 

[복습] SQL | Oracle 부정연산자 not equal join 과 exists 연산자 + 복습후기(20231114)

먼저 부정연산자 중에 not equal in이 있다. != 이것인데, 이 부정연산자 not equal은 STEP 1) join할 테이블의 모든 카티시안 곱(발생 가능한 모든 조합)을 만든 후에 STEP 2) 모든 조합에서 조건이 일치하지

metime.tistory.com

를 참고하여 SQL에서의 exist, not exist 했던 것과 유사하므로 참고하여 같이 공부하도록 하자.

 

728x90
반응형