파이썬에서의 집합연산자를 살펴보자.
테스트를 위하여 위와 같은 데이터프레임을 만들어두었다.
이 결과는 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에서의 exist, not exist 했던 것과 유사하므로 참고하여 같이 공부하도록 하자.
'배우기 > 복습노트[Python과 분석]' 카테고리의 다른 글
[복습] Python | 분석 | 데이터 분석 들어가기 (0) | 2024.01.26 |
---|---|
[복습] Python 자료구조(4) (array) (0) | 2024.01.26 |
[복습] Python 중복값 처리(unique, duplicated, drop_duplicates) (0) | 2024.01.25 |
[복습] Python 데이터 병합(pd.concat) (0) | 2024.01.25 |
[복습] Python Series와 DataFrame의 특성(reindex, add, sub, mul, div) (0) | 2024.01.25 |