티스토리 뷰
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엔 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인 컬럼만 남길 수 있음!!!
'pandas' 카테고리의 다른 글
pd.to_datetime, strptime, strftime, (0) | 2022.07.15 |
---|---|
group by 후 custom된 집계함수 사용 (0) | 2022.06.16 |
drop id max, datetime, 요일, one-hot encoding, lag, mms (0) | 2022.03.06 |
group/sort by, index, series, array, rename, concat, merge, type (0) | 2022.03.06 |
CSV 읽기/쓰기, 행/열 선택/삭제, axis (0) | 2021.08.09 |
- Total
- Today
- Yesterday