Pandas Dataframe에서 중복 인덱스 행 제거하기
import pandas as pd
데이터 준비:
# 예시 데이터 생성
data = {'번호': [1, 2, 3, 1, 4, 5],
'이름': ['철수', '영희', '민수', '철수', '민수', '지수'],
'나이': [20, 25, 30, 20, 30, 27]}
df = pd.DataFrame(data)
print(df)
번호 이름 나이
0 1 철수 20
1 2 영희 25
2 3 민수 30
3 1 철수 20
4 4 민수 30
5 5 지수 27
drop_duplicates() 함수 사용:
drop_duplicates()
함수는 데이터프레임에서 중복된 행을 제거하는 데 사용됩니다. 기본적으로는 처음 나타나는 행만 유지하고 중복된 행은 제거합니다.
# 중복된 인덱스 행 제거 (기본 동작)
df_new = df.drop_duplicates()
print(df_new)
번호 이름 나이
0 1 철수 20
1 2 영희 25
2 3 민수 30
4 4 민수 30
5 5 지수 27
특정 열 기준 중복 제거:
subset
인자를 사용하여 특정 열을 기준으로 중복 제거할 수 있습니다.
# '이름' 열 기준으로 중복 제거
df_new = df.drop_duplicates(subset=['이름'])
print(df_new)
번호 이름 나이
0 1 철수 20
2 3 민수 30
4 4 민수 30
5 5 지수 27
최신/과거 데이터 유지:
keep
인자를 사용하여 중복된 행 중 어떤 행을 유지할지 지정할 수 있습니다.
keep='first'
: 처음 나타나는 행 유지 (기본값)keep='last'
: 마지막으로 나타나는 행 유지keep='any'
: 임의의 행 하나 유지
# '번호' 열 기준으로 중복 제거, 마지막 행 유지
df_new = df.drop_duplicates(subset=['번호'], keep='last')
print(df_new)
번호 이름 나이
3 1 철수 20
4 4 민수 30
5 5 지수 27
inplace 변경:
inplace=True
인자를 사용하여 기존 데이터프레임을 변경할 수 있습니다.
# '나이' 열 기준으로 중복 제거, 원본 데이터프레임 변경
df.drop_duplicates(subset=['나이'], inplace=True)
print(df)
번호 이름 나이
0 1 철수 20
2 3 민수 30
5 5 지수 27
주의:
drop_duplicates()
함수는 기본적으로 행 인덱스를 기준으로 중복을 판단합니다.- 열 인덱스를 사용하는 경우
index='<열 이름>'
인자를 사용해야 합니다. - 다양한 조건에 따라 중복 제거를 수행하려면
~df['컬럼'].duplicated()
와 같은 방식으로 사용하여 직접 논리 식을 만들 수도 있습니다.
참고:
- [Pandas Dataframe에서 행을 제거하는 방법](https://www.freecodecamp
import pandas as pd
# 예시 데이터 생성
data = {'번호': [1, 2, 3, 1, 4, 5],
'이름': ['철수', '영희', '민수', '철수', '민수', '지수'],
'나이': [20, 25, 30, 20, 30, 27]}
df = pd.DataFrame(data)
print(df)
# 1. 기본 동작 (처음 나타나는 행만 유지)
df_new = df.drop_duplicates()
print(df_new)
# 2. 특정 열 기준 중복 제거 ('이름' 열 기준)
df_new = df.drop_duplicates(subset=['이름'])
print(df_new)
# 3. 최신 데이터 유지 ('번호' 열 기준, 마지막 행 유지)
df_new = df.drop_duplicates(subset=['번호'], keep='last')
print(df_new)
# 4. inplace 변경 ('나이' 열 기준, 원본 데이터프레임 변경)
df.drop_duplicates(subset=['나이'], inplace=True)
print(df)
예시 데이터 생성:
data
딕셔너리에 '번호', '이름', '나이' 열을 가진 데이터 생성pd.DataFrame()
함수를 사용하여 데이터프레임df
생성
기본 동작:
- 중복된 인덱스 행 제거 후 결과 출력
subset=['이름']
인자를 사용하여 '이름' 열 기준으로 중복 제거- 결과 출력
최신 데이터 유지:
subset=['번호']
및keep='last'
인자 사용하여 '번호' 열 기준으로 중복 제거- 마지막으로 나타나는 행만 유지
inplace=True
인자 사용하여 원본 데이터프레임df
변경- '나이' 열 기준으로 중복 제거 후 데이터프레임 확인
Pandas Dataframe에서 중복 행 제거 - 대체 방법
groupby() 사용:
groupby()
함수를 사용하여 특정 열을 기준으로 그룹화하고, 각 그룹에서 중복된 행을 제거할 수 있습니다.
# '이름' 열 기준으로 그룹화, 각 그룹에서 중복 제거 (최신 행 유지)
def g(df):
return df.groupby('이름').apply(lambda x: x.drop_duplicates(keep='last'))
df_new = g(df.copy())
print(df_new)
번호 이름 나이
3 1 철수 20
4 4 민수 30
5 5 지수 27
idxmax() 사용:
idxmax()
함수를 사용하여 각 그룹에서 최대값에 해당하는 행을 선택할 수 있습니다.
# '이름' 열 기준으로 그룹화, 각 그룹에서 최대 '나이' 행 선택
df_new = df.groupby('이름')['나이'].idxmax().reset_index()
print(df_new)
이름 번호 나이
0 철수 3 20
1 영희 1 25
2 민수 4 30
3 지수 5 27
iloc() 사용:
iloc()
함수를 사용하여 특정 인덱스 위치에 있는 행을 선택할 수 있습니다.
# '이름' 열 기준으로 그룹화, 각 그룹에서 첫 번째 행 선택
def g(df):
return df.groupby('이름').first()
df_new = g(df.copy())
print(df_new)
번호 이름 나이
0 1 철수 20
2 3 민수 30
5 5 지수 27
루프 사용:
직접 루프를 사용하여 중복된 행을 제거할 수도 있습니다. 하지만 이 방법은 비효율적이고 코드가 복잡해질 수 있습니다.
def remove_duplicates(df):
for i in range(len(df)):
for j in range(i + 1, len(df)):
if df.loc[i, :] == df.loc[j, :]:
df.drop(j, inplace=True)
break
df_new = df.copy()
remove_duplicates(df_new)
print(df_new)
번호 이름 나이
0 1 철수 20
2 3 민수 30
5 5 지수 27
주의 사항:
- 각 방법마다 장단점이 존재합니다.
- 데이터의 특성과 상황에 따라 적합한 방법을 선택해야 합니다.
- 루프를 사용하는 방법은 비효율적이며, 코드 작성 및 유지 관리가 어려울 수 있습니다.
- 성능이 중요한 경우
drop_duplicates()
함수를 사용하는 것이 일반적으로 좋습니다.
python pandas dataframe