티스토리 뷰

value_count(값의 개수) / 차집합

'col2'라는 공통 컬럼을 가진 두 데이터 프레임을 비교하여 df2에는 있는데 df1에는 없는 'col2'값을 찾겠습니다. 

d1 = {'col1': ['a', 'b', 'c'], 'col2': [1, 2, 3]}
df1 = pd.DataFrame(data=d1)

drop_duplicates()

d2 = {'col2':[2, 3, 3, 4]}
df2 = pd.DataFrame(data=d2)
# df2 내에서 중복된 값을 없애준다. 
df2 = df2.drop_duplicates().reset_index(drop=True)

위와 같이 두 Data Frame이 있을 때 df2에는 있고 df1에는 없는 '4'라는 값을 찾겠습니다. 

먼저 df1에 df2를 concat 합니다. 

df = pd.concat([df1, df2])  # df = df.append(df2)  # df1에 df2를 concat.

value_counts()

col2의 각 값이 중복인지 확인하기 위해 col2를 값 별로 count 합니다. 

c = df['col2'].value_counts()  # col2 값 별 중복 개수 확인.

위에서 만든 value_counts()를 data frame 형태로 바꿔줍니다. 

c = c.to_frame('counts').reset_index().rename(columns={'index':'col2'})  # col2, COUNTS 형태의 df로 만듦.

df와 value_counts()로 만든 data frame인 c를 merge 합니다. 

df = pd.merge(left=df, right=c, on='col2')  # df에 col2의 중복 개수를 나타내는 'counts' 컬럼 추가.

df1: 파랑, df2: 노랑

df1엔 col1에 값이 있고, df2엔 col1에 값이 없어서 null처리 된 점을 이용하여 다음 작업을 합니다. 

따라서 아래 방법을 사용할 땐 df1에 col1이 null인 값이 없게 해야합니다. 

# 중복이 아니고(['counts'] == 1) & df2에서 가져온 데이터만 선택. (df2는 'col1'이 null()임.)
df = df[(df['counts'] == 1) & (df['col1'].isnull())]

 

 

 


duplicated (중복 값 선택) / 교집합

'col2'라는 공통 컬럼을 가진 두 데이터 프레임을 비교하여 df1, df2 모두에 있는 'col2'의 값을 찾겠습니다.

d1 = {'col1': ['a', 'b', 'c', 'd'], 'col2': [1, 2, 3, 4]}
df1 = pd.DataFrame(data=d1)
d2 = [2, 3, 4, 5]
df2 = pd.DataFrame(data=d2, columns=['col2'])
df1 df2

df1, df2 모두에 있는 2, 3, 4를 찾으면 됩니다. 

df = df1.append(df2)

duplicated

a = df[df.duplicated(['col2'], keep='last')]  # 중복인 값만 남기기.

 

 

 


drop_duplicates(중복 값 제거), duplicated(중복 값 선택)

col2의 값은 같은데 col1의 값이 다른 케이스를 찾겠습니다. 

d = {'col1': ['a', 'b', 'c', 'c', 'd'], 'col2': [1, 2, 3, 3, 3]}
df = pd.DataFrame(data=d)

drop_duplicates()

col1, col2가 모두 같은 행을 제거 합니다. 

df = df.drop_duplicates(['col1', 'col2'])  # .reset_index(drop=True)

duplicated()

중복 값을 찾습니다. 

a = df[df.duplicated(['col2'], keep='last')]  # 중복된 값

a = a['col2'].tolist()  # 중복된 값을 리스트로.
df = df[df['col2'].isin(a)].sort_values(['col2'])  # 중복된 값이 있는 행만 선택

 

23년 4월 추가 (쉬운 방법 찾음)

df = pd.merge(df1, df2, how='outer', indicator=True)  # 이렇게 하면 "_merge"라는 컬럼에 "left_only"인지 정보가 기록됨. 

df = pd.merge(df1, df2, how='outer', indicator=True).query('_merge == "left_only"') # 해당 조건에 부합하는 데이터 추출

(단, query함수는 loc로 구현한 것보다 속도가 느리다고하니 추후 수정해야함.)

df = pd.merge(df1, df2, how='outer', indicator=True).query('_merge == "left_only"').drop(columns=['_merge']) # '_merge' 라는 컬럼 삭제

-> 이렇게 하면 left only인 컬럼만 남길 수 있음!!! 

댓글
Total
Today
Yesterday
공지사항
최근에 올라온 글
글 보관함