[복습] Python 집합연산자(union, intersection, difference, np.union1d, np.intersect1d, np.setdiff1d, pd.merge)
파이썬에서의 집합연산자를 살펴보자.
테스트를 위하여 위와 같은 데이터프레임을 만들어두었다.
이 결과는 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만 추출해내면 차집합과 같은 효과를 가질 수 있다.
차집합2) emp_2030, emp_1020
이 결과는 최종적으로 DEPTNO가 30만 남게 된다.
위와같이 하면 20만 제거가 된다.
그런데 10번 부서를 한번 더 넣어주게 되면 10번 부서가 중복이 되면서 keep = False 옵션에 의하여 전체가 사라지기 때문이다.
이렇게 생각해 낼 줄도 알아야겠다.
pd.merge로도 풀어보자.
연습문제
gogak.csv, blacklist.csv 파일을 읽고 각 고객의 가용 포인트 기준 사은품 전달 행사를 하려고 한다. 블랙리스트 고객을 제외하여라.
데이터는 아래와 같다.
1) 차집합
제거라는 개념보다는 차집합으로 접근
2) in 연산자
3) merge
[복습] SQL | Oracle 부정연산자 not equal join 과 exists 연산자 + 복습후기(20231114)
먼저 부정연산자 중에 not equal in이 있다. != 이것인데, 이 부정연산자 not equal은 STEP 1) join할 테이블의 모든 카티시안 곱(발생 가능한 모든 조합)을 만든 후에 STEP 2) 모든 조합에서 조건이 일치하지
metime.tistory.com
를 참고하여 SQL에서의 exist, not exist 했던 것과 유사하므로 참고하여 같이 공부하도록 하자.