Pandas에서 다른 데이터프레임에 없는 행 가져오기
Pandas에서 다른 데이터프레임에 없는 행 가져오기
isin() 함수 사용
두 데이터프레임의 공통된 열을 기준으로 비교하여 다른 데이터프레임에 없는 행을 추출할 수 있습니다.
# 두 데이터프레임 생성
df1 = pd.DataFrame({'A': [1, 2, 3], 'B': ['a', 'b', 'c']})
df2 = pd.DataFrame({'A': [2, 3, 4], 'B': ['b', 'c', 'd']})
# df1에 있지만 df2에는 없는 행 추출
df_not_in_df2 = df1[~df1['A'].isin(df2['A'])]
print(df_not_in_df2)
# A B
# 0 1 a
merge() 함수 사용
merge()
함수를 사용하여 두 데이터프레임을 조합하고 indicator
옵션을 사용하여 다른 데이터프레임에 없는 행을 식별할 수 있습니다.
# 'indicator' 옵션으로 left_only, right_only 열 추가
df_merged = pd.merge(left=df1, right=df2, how='outer', indicator=True)
# left_only 열이 'left_only'인 행 추출
df_not_in_df2 = df_merged[df_merged['indicator'] == 'left_only']
print(df_not_in_df2)
# A B indicator
# 0 1 a left_only
set() 연산 사용
# 두 데이터프레임의 행을 집합으로 변환
df1_set = set(df1.to_records(index=False))
df2_set = set(df2.to_records(index=False))
# df1_set에 있지만 df2_set에는 없는 행 추출
df_not_in_df2 = df1_set - df2_set
# 결과 출력
for row in df_not_in_df2:
print(row)
# (1, 'a')
# (2, 'b')
각 방법은 장단점이 있으며, 상황에 따라 적합한 방법을 선택해야 합니다.
isin()
함수는 사용하기 간편하지만, 두 데이터프레임의 공통된 열이 있어야 합니다.merge()
함수는 공통된 열이 없어도 사용할 수 있지만, 코드가 다소 복잡해집니다.set()
연산은 코드가 간결하지만, 데이터프레임의 순서가 유지되지 않습니다.
예제 코드
# 두 데이터프레임 생성
df1 = pd.DataFrame({'A': [1, 2, 3], 'B': ['a', 'b', 'c']})
df2 = pd.DataFrame({'A': [2, 3, 4], 'B': ['b', 'c', 'd']})
# 방법 1: `isin()` 함수 사용
df_not_in_df2_isin = df1[~df1['A'].isin(df2['A'])]
# 방법 2: `merge()` 함수 사용
df_merged = pd.merge(left=df1, right=df2, how='outer', indicator=True)
df_not_in_df2_merge = df_merged[df_merged['indicator'] == 'left_only']
# 방법 3: `set()` 연산 사용
df1_set = set(df1.to_records(index=False))
df2_set = set(df2.to_records(index=False))
df_not_in_df2_set = df1_set - df2_set
# 결과 비교
print('isin():')
print(df_not_in_df2_isin)
print('merge():')
print(df_not_in_df2_merge)
print('set():')
for row in df_not_in_df2_set:
print(row)
실행 결과
isin():
A B
0 1 a
merge():
A B indicator
0 1 a left_only
set():
(1, 'a')
(2, 'b')
대체 방법
numpy.setdiff1d() 함수 사용
import numpy as np
# 두 데이터프레임의 'A' 열 추출
df1_A = df1['A'].to_numpy()
df2_A = df2['A'].to_numpy()
# df1_A에 있지만 df2_A에는 없는 값 추출
df_not_in_df2_np = np.setdiff1d(df1_A, df2_A)
# 결과 출력
for value in df_not_in_df2_np:
print(value)
collections.Counter() 사용
from collections import Counter
# 두 데이터프레임의 'A' 열 값 개수 카운팅
df1_A_counts = Counter(df1['A'])
df2_A_counts = Counter(df2['A'])
# df1_A에만 존재하는 값 추출
df_not_in_df2_counter = df1_A_counts - df2_A_counts
# 결과 출력
for value, count in df_not_in_df2_counter.items():
if count > 0:
print(value)
위 방법들은 모두 비교적 간단하지만, 데이터프레임의 크기가 크거나 속도가 중요한 경우에는 효율적이지 않을 수 있습니다.
python pandas dataframe