Pandas를 활용해 데이터를 전처리하다 보면, 특정 조건에 따라 행을 삭제하거나 인덱스와 컬럼명을 기준으로 값을 가져오는 일이 자주 발생합니다. 이번 글에서는 DataFrame에서 조건에 맞는 행을 안전하게 삭제하는 방법과 특정 셀의 값을 가져오는 여러 가지 방식을 함께 정리해보겠습니다.
DataFrame에서 조건에 맞는 행 삭제하기
1. 반복문 없이 조건 필터링으로 삭제 (추천)
Pandas에서는 반복문보다 조건 필터링을 사용하는 것이 훨씬 효율적이고 안전합니다.
# 예: 'boundary' 컬럼이 빈 문자열("")인 행 제거
df = df[df['boundary'] != '']
혹은 drop()
메서드를 사용하는 방식도 가능합니다.
df.drop(df[df['boundary'] == ''].index, inplace=True)
2. 반복문 안에서 삭제하려면? → 인덱스만 모아 일괄 삭제
반복문 안에서 바로 df.drop()
을 사용하는 것은 인덱스 변화로 인해 오류가 생길 수 있습니다. 대신 삭제할 인덱스를 따로 모아서 한 번에 삭제해야 합니다.
drop_indices = []
for idx, row in df.iterrows():
if row['boundary'] == '':
drop_indices.append(idx)
df.drop(index=drop_indices, inplace=True)
3. NaN 또는 빈 문자열 모두 제거하기
엑셀 데이터를 불러왔을 때는 빈 셀은 NaN, 빈 문자열은 ""
으로 들어오는 경우가 있습니다. 아래와 같이 두 조건을 모두 고려해 필터링할 수 있습니다.
df = df[df['컬럼명'].notna() & (df['컬럼명'] != '')]
여러 컬럼 기준으로도 다음과 같이 처리할 수 있습니다.
cols = ['col1', 'col2']
df = df[~df[cols].apply(lambda x: (x == '') | (x.isna())).any(axis=1)]
반복문 안에서 notna()
사용하기
notna()
는 반복문 안에서도 유용하게 사용할 수 있습니다.
for idx, row in df.iterrows():
if pd.notna(row['name']):
print(f"{row['name']}은 유효한 값입니다.")
pd.isna()
도 반대로 사용할 수 있으며, NaN
여부를 조건문에서 깔끔하게 처리할 수 있습니다.
인덱스와 컬럼명으로 특정 셀 값 가져오기
1. .loc[]
: 라벨 기반 접근
value = df.loc['a', 'age']
2. .at[]
: 단일 값 빠르게 접근
value = df.at['a', 'age']
속도는 .loc[]
보다 빠르며, 단일 값에만 사용 가능합니다.
3. .iloc[]
: 정수 인덱스 기반 접근
value = df.iloc[0, 1] # 0번째 행, 1번째 열
4. 조건 필터링 후 값 가져오기
value = df[df['name'] == 'Bob']['age'].values[0]
조건이 하나만 해당될 때는 values[0]
을 통해 직접 값을 추출할 수 있습니다.
마무리
Pandas에서는 반복문보다 조건 필터링을 통한 데이터 전처리가 더욱 권장됩니다. 불필요한 반복문을 줄이고, notna()
, drop()
, loc[]
, at[]
등의 함수들을 적절히 활용하면 보다 안정적이고 효율적인 데이터 처리 작업이 가능합니다.
'개발 (Development) > Python' 카테고리의 다른 글
[Python] 문자열 2줄 이상인지 확인하는 방법 (0) | 2025.07.28 |
---|---|
[Python] 딕셔너리에서 정규표현식으로 특정 형식의 키 추출하기 (4) | 2025.07.28 |
[Python] pandas로 DataFrame 비교하여 특정 값 제거하는 방법 (0) | 2025.07.20 |
[Python] JSON 파일을 CSV로 변환 (1) | 2025.06.01 |
[Python] 배열을 1000개 단위로 나누어 처리하는 방법 (0) | 2025.05.18 |