Pandas 면접 질문 및 답변

PandasBeginner
지금 연습하기

소개

Pandas 관련 면접에서 뛰어난 성과를 거두는 데 필요한 지식과 자신감을 갖추도록 설계된 이 포괄적인 가이드에 오신 것을 환영합니다. 신진 데이터 분석가, 숙련된 데이터 과학자 또는 ML 엔지니어이든 효율적인 데이터 처리 및 분석을 위해서는 Pandas 숙달이 필수적입니다. 이 문서는 기본 개념 및 실용적인 데이터 조작 시나리오부터 고급 기법, 성능 최적화 및 프로덕션 환경에서의 실제 애플리케이션에 이르기까지 광범위한 주제를 체계적으로 다룹니다. 이해도를 높이고 기술을 연마하여 어떤 Pandas 과제에도 잘 대비할 수 있도록 준비하십시오.

PANDAS

Pandas 기본 개념

Pandas 의 두 가지 주요 데이터 구조는 무엇이며 어떻게 다른가요?

답변:

두 가지 주요 데이터 구조는 Series 와 DataFrame 입니다. Series 는 스프레드시트의 열과 유사하게 모든 데이터 유형을 보유할 수 있는 1 차원 레이블이 지정된 배열입니다. DataFrame 은 잠재적으로 다른 유형의 열을 가진 2 차원 레이블이 지정된 데이터 구조로, 테이블 또는 스프레드시트를 닮았습니다.


Pandas 에서 '인덱스 (index)' 개념을 설명하고 그 중요성은 무엇인가요?

답변:

Pandas 의 인덱스는 행 또는 열에 대한 레이블로, 데이터를 고유하게 식별하고 액세스하는 방법을 제공합니다. 특히 DataFrame 을 병합하거나 조인하는 동안 효율적인 데이터 정렬, 선택 및 조작에 중요합니다.


Python 딕셔너리에서 Pandas Series 와 DataFrame 을 어떻게 생성하나요?

답변:

Series 는 키가 인덱스가 되고 값이 데이터가 되는 딕셔너리에서 생성할 수 있습니다. DataFrame 은 키가 열 이름이 되고 값이 열 데이터를 나타내는 리스트/배열인 딕셔너리에서 생성할 수 있습니다. 예를 들어: pd.Series({'a': 1})pd.DataFrame({'col1': [1, 2]})입니다.


데이터 선택 시 lociloc의 차이점은 무엇인가요?

답변:

loc는 주로 레이블 기반 인덱싱으로, 행 및 열 레이블로 데이터를 선택하는 데 사용됩니다. iloc는 정수 위치 기반 인덱싱으로, 행 및 열의 정수 위치로 데이터를 선택하는 데 사용됩니다. loc는 끝 레이블을 포함하지만 iloc는 끝 정수를 제외합니다.


Pandas DataFrame 에서 누락된 값 (NaN) 을 어떻게 처리하나요?

답변:

누락된 값은 isnull() 또는 isna()와 같은 메서드를 사용하여 감지하고, NaN 이 있는 행/열을 제거하기 위해 dropna()를 사용하거나, 지정된 값 (예: 평균, 중앙값 또는 상수) 으로 NaN 을 대체하기 위해 fillna()를 사용하여 처리할 수 있습니다. 선택은 데이터 및 분석 목표에 따라 달라집니다.


Pandas 에서 groupby() 메서드를 설명해주세요.

답변:

groupby() 메서드는 하나 이상의 열 값을 기준으로 DataFrame 의 행을 그룹화하는 데 사용됩니다. 이는 GroupBy 객체를 반환하며, 이 객체를 사용하여 각 그룹에 집계 함수 (예: sum(), mean(), count()) 를 적용하여 split-apply-combine 작업을 수행할 수 있습니다.


Pandas 에서 apply()의 목적은 무엇인가요?

답변:

apply() 메서드는 DataFrame 또는 Series 의 축을 따라 함수를 적용하는 데 사용됩니다. 매우 유연하여 사용자 정의 함수 또는 내장 함수를 요소별, 행별 또는 열별로 적용할 수 있으며, 이는 내장 메서드로 다루어지지 않는 복잡한 변환에 유용합니다.


두 개의 DataFrame 을 어떻게 병합 (merge) 하나요?

답변:

pd.merge() 함수는 SQL 조인과 유사하게 공통 열 또는 인덱스를 기반으로 두 개의 DataFrame 을 결합하는 데 사용됩니다. DataFrame, 키 열 (on 또는 left_on/right_on) 및 조인 유형 (how - 예: 'inner', 'outer', 'left', 'right') 을 지정합니다.


copy()와 DataFrame 을 직접 할당하는 것의 차이점은 무엇인가요?

답변:

DataFrame 을 직접 할당하는 것 (예: df2 = df1) 은 뷰를 생성합니다. 즉, df2df1과 동일한 기본 데이터에 대한 또 다른 참조일 뿐입니다. df2의 변경 사항은 df1에 영향을 미칩니다. df2 = df1.copy()를 사용하면 깊은 복사가 이루어져 df2가 자체 데이터를 가진 독립적인 DataFrame 이 되므로 df2의 변경 사항은 df1에 영향을 미치지 않습니다.


DataFrame 의 열 데이터 유형을 어떻게 변경할 수 있나요?

답변:

astype() 메서드를 사용하여 열의 데이터 유형을 변경할 수 있습니다. 예를 들어, df['column_name'] = df['column_name'].astype('int')는 열을 정수 유형으로 변환합니다. 이는 올바른 데이터 작업 및 메모리 효율성을 보장하는 데 중요합니다.


데이터 조작 및 변환 시나리오

Pandas DataFrame 에서 누락된 값 (NaN) 을 어떻게 처리하나요?

답변:

누락된 값은 df.dropna()를 사용하여 NaN 이 있는 행/열을 제거하거나, df.fillna()를 사용하여 특정 값 (예: 0, 평균, 중앙값 또는 이전/이후 채우기) 으로 NaN 을 대체하여 처리할 수 있습니다. 선택은 데이터 및 분석 목표에 따라 달라집니다.


DataFrame 인덱싱에서 lociloc의 차이점을 설명해주세요.

답변:

loc는 주로 레이블 기반 인덱싱으로, 행/열 레이블을 사용하여 데이터를 선택합니다. iloc는 정수 위치 기반 인덱싱으로, 정수 위치 (0 부터 길이 -1 까지) 를 사용하여 데이터를 선택합니다. 둘 다 단일 선택 또는 슬라이싱에 사용할 수 있습니다.


Pandas 에서 두 개의 DataFrame 간에 SQL 스타일 JOIN 작업을 어떻게 수행하나요?

답변:

SQL 스타일 JOIN 은 pd.merge() 함수를 사용하여 수행됩니다. DataFrame, 공통 열에 대한 on 인수 및 조인 유형 (how - 예: 'inner', 'left', 'right', 'outer') 을 지정합니다.


DataFrame 에서 데이터를 그룹화하고 집계 함수를 적용하는 방법을 설명해주세요.

답변:

데이터는 df.groupby() 메서드를 사용하여 그룹화되며, 그룹화할 열을 지정합니다. 그룹화 후 sum(), mean(), count(), min(), max()와 같은 집계 함수를 그룹화된 객체에 적용하여 데이터를 요약할 수 있습니다.


DataFrame 열 또는 행에 사용자 정의 함수를 어떻게 적용할 수 있나요?

답변:

열별 작업의 경우 df['column'].apply(custom_func)를 사용합니다. 여러 열에 걸친 행별 또는 요소별 작업의 경우 행에는 df.apply(custom_func, axis=1)를, 열에는 df.apply(custom_func, axis=0)를 사용합니다. 성능을 위해 벡터화된 연산이 일반적으로 선호됩니다.


pivot_table은 무엇에 사용되며 groupby와 어떻게 다른가요?

답변:

pivot_table은 스프레드시트 스타일의 피벗 테이블을 DataFrame 으로 생성하여 하나 이상의 키 열별로 데이터를 요약하는 데 사용됩니다. groupby는 하나 이상의 키를 기준으로 데이터를 집계하는 반면, pivot_table은 지정된 인덱스, 열 및 값을 사용하여 데이터를 새로운 테이블 형식으로 언스택하고 재구성할 수도 있습니다.


Pandas DataFrame 의 열 데이터 유형을 어떻게 변경할 수 있나요?

답변:

열의 데이터 유형은 astype() 메서드를 사용하여 변경할 수 있습니다. 예를 들어, df['column'] = df['column'].astype('int') 또는 날짜의 경우 df['column'] = pd.to_datetime(df['column'])입니다. 이는 올바른 데이터 조작 및 분석에 중요합니다.


DataFrame 에서 중복 행을 제거하는 방법을 설명해주세요.

답변:

중복 행은 df.drop_duplicates() 메서드를 사용하여 제거할 수 있습니다. 기본적으로 모든 열을 고려하고 첫 번째 발생을 유지합니다. subset 인수를 사용하여 열의 하위 집합을 지정하고 'first', 'last' 또는 False(모두) 중복을 유지할지 여부를 지정할 수 있습니다.


기존 열을 기반으로 DataFrame 에 새 열을 어떻게 생성하나요?

답변:

기존 열에 대한 연산을 수행하여 새 열을 생성할 수 있습니다. 예: df['new_col'] = df['col1'] + df['col2']. 더 복잡한 논리의 경우 람다 함수 또는 정의된 함수와 함께 apply() 메서드를 사용하거나 조건부 할당에 np.where()를 사용할 수 있습니다.


Pandas 에서 stack()unstack()의 목적은 무엇인가요?

답변:

stack()은 DataFrame(또는 Series) 을 와이드 형식에서 롱 형식으로 변환하여 가장 안쪽 열 인덱스를 가장 안쪽 행 인덱스로 피벗합니다. unstack()은 반대 작업을 수행하여 가장 안쪽 행 인덱스를 가장 안쪽 열 인덱스로 피벗하여 롱 형식에서 와이드 형식으로 변환합니다.


DataFrame 을 하나 이상의 열로 정렬하는 방법은 무엇인가요?

답변:

DataFrame 은 df.sort_values() 메서드를 사용하여 정렬할 수 있습니다. 열 이름 또는 열 이름 목록을 by 인수에 지정합니다. ascending 인수 (기본값 True) 는 정렬 순서를 제어하고, inplace=True는 DataFrame 을 직접 수정할 수 있습니다.


pd.concat()pd.merge()를 언제 사용해야 하나요?

답변:

pd.concat()은 유사한 구조를 가지거나 쌓고 싶을 때 DataFrame 을 축 (행별 또는 열별) 을 따라 결합하는 데 사용됩니다. pd.merge()는 다른 소스의 관련 데이터를 결합하고 싶을 때 SQL 조인과 유사하게 공통 열 (키) 을 기반으로 DataFrame 을 결합하는 데 사용됩니다.


고급 Pandas 기법 및 최적화

대규모 데이터셋의 경우 Pandas DataFrame 의 메모리 사용량을 어떻게 최적화할 수 있나요?

답변:

메모리 최적화에는 적절한 데이터 유형 사용 (예: 저카디널리티 문자열의 경우 category, 작은 정수의 경우 int8/int16), 숫자 유형 다운캐스팅, 불필요한 객체 열 방지가 포함됩니다. df.info(memory_usage='deep') 메서드는 메모리 사용량이 많은 열을 식별하는 데 도움이 됩니다.


Pandas 에서 apply(), map(), applymap()의 차이점과 각각을 언제 사용해야 하는지 설명해주세요.

답변:

map()은 Series 에 대한 요소별 적용입니다. apply()는 Series 또는 DataFrame 에 대한 것으로, 축 (행/열) 을 따라 함수를 적용합니다. applymap()은 DataFrame 에 대한 요소별 적용입니다. 가능한 경우 applymap()보다 성능 면에서 일반적으로 map()apply()가 선호됩니다.


groupby().transform()groupby().apply()를 언제 사용해야 하나요?

답변:

transform()은 원본과 동일한 인덱스를 가진 Series/DataFrame을 반환하며, 집계된 결과를 원본 모양으로 다시 브로드캐스팅합니다. apply()는 더 유연하여 Series, DataFrame 또는 스칼라를 반환할 수 있는 임의의 함수를 허용하지만, 원본 인덱스나 모양을 유지하지 못할 수 있습니다.


Pandas 에서 연산 '체이닝 (chaining)'의 개념과 일반적으로 권장되지 않는 이유를 설명해주세요.

답변:

체이닝은 중간 결과를 할당하지 않고 단일 줄에서 DataFrame 에 여러 연산을 수행하는 것을 의미합니다. 모호한 뷰 대 복사로 인해 SettingWithCopyWarning이 발생할 수 있고 코드를 디버깅하기 어렵게 만들며 잠재적으로 잘못된 결과를 초래할 수 있으므로 권장되지 않습니다. 명시적인 중간 할당이 더 안전합니다.


Pandas 에서 SettingWithCopyWarning을 어떻게 처리하나요?

답변:

이 경고는 Pandas 가 연산이 뷰인지 복사본인지 명확하게 결정할 수 없을 때 발생합니다. 이를 해결하려면 .loc[]를 사용하여 명시적으로 인덱싱하고 할당하여 수정하려는 경우 복사본을 사용하고 그렇지 않은 경우 뷰를 사용하도록 합니다. 예를 들어, df.loc[rows, cols] = value입니다.


기본적인 벡터화된 연산 외에 대규모 DataFrame 에 대한 연산을 속도를 높이는 몇 가지 일반적인 방법은 무엇인가요?

답변:

벡터화 외에도 사용자 정의 함수에 대한 JIT 컴파일을 위해 Numba, 성능이 중요한 부분을 C 로 작성하기 위해 Cython, 또는 코어 외부 및 병렬 컴퓨팅을 위해 Dask를 고려할 수 있습니다. 특정 작업의 경우 Pandas의 내장 메서드가 종종 매우 최적화되어 있습니다.


pd.Categorical 데이터 유형의 목적과 그 이점을 설명해주세요.

답변:

pd.Categorical은 값이 고정된 집합으로 제한되는 범주형 데이터를 나타내는 데 사용됩니다. 반복되는 문자열 대신 정수를 저장하여 메모리를 절약하고, 특히 저카디널리티 열의 경우 groupby() 및 정렬과 같은 연산을 크게 가속화할 수 있습니다.


메모리 부족 없이 대규모 CSV 파일을 Pandas 로 효율적으로 읽는 방법은 무엇인가요?

답변:

pd.read_csv()에서 chunksize를 사용하여 파일을 더 작은 부분으로 읽고 각 청크를 반복적으로 처리합니다. 처음부터 메모리 사용량을 최적화하기 위해 열에 대한 dtype을 지정합니다. usecols 매개변수를 사용하여 필요한 열만 선택합니다.


Pandas 메서드에서 inplace 매개변수의 중요성과 사용이 종종 권장되지 않는 이유는 무엇인가요?

답변:

inplace=True는 새 DataFrame 을 반환하지 않고 DataFrame 을 직접 수정하여 메모리를 절약합니다. 그러나 메서드 체이닝을 방해하고 디버깅을 더 어렵게 만들며 신중하게 처리하지 않으면 예기치 않은 동작을 유발할 수 있습니다. 결과를 새 변수에 할당하는 것이 일반적으로 권장됩니다.


Pandas 에서 시계열 리샘플링 및 집계를 수행하는 방법을 설명해주세요.

답변:

DateTimeIndex 가 있는 DataFrame 에서 .resample() 메서드를 사용합니다. 원하는 빈도 (예: 일별 'D', 월별 'M') 를 지정합니다. 그런 다음 리샘플링된 객체에 .mean(), .sum(), .ohlc()와 같은 집계 함수를 적용합니다.


실용적인 적용 및 문제 해결

'customer_id', 'order_date', 'total_amount'를 포함하는 고객 주문 데이터가 있는 DataFrame 이 있습니다. 총 지출액 기준 상위 5 명의 고객을 어떻게 찾을 수 있나요?

답변:

DataFrame 을 'customer_id'별로 그룹화하고, 각 고객의 'total_amount'를 합산한 다음, 내림차순으로 정렬합니다. 마지막으로 .head(5)를 사용하여 상위 5 개 항목을 선택합니다.


'timestamp' 열이 있는 DataFrame 이 주어졌을 때, 연도와 월을 별도의 새 열로 어떻게 추출할 수 있나요?

답변:

먼저 'timestamp' 열이 datetime dtype 인지 확인합니다. 그런 다음 .dt 접근자를 사용하여 연도와 월을 추출합니다: df['year'] = df['timestamp'].dt.yeardf['month'] = df['timestamp'].dt.month.


누락된 값이 있는 DataFrame 이 있습니다. 누락된 값을 처리하는 두 가지 일반적인 전략과 언제 하나를 다른 것보다 선택할 수 있는지 설명해주세요.

답변:

두 가지 전략은 df.dropna()를 사용하여 행/열을 삭제하거나 df.fillna()를 사용하여 누락된 값을 채우는 것입니다. dropna는 누락된 데이터가 최소이거나 무작위일 때 적합합니다. fillna는 데이터 분포를 크게 왜곡하지 않고 값을 대체할 수 있을 때 (예: 평균, 중앙값 또는 특정 상수) 선호됩니다.


'id'와 'name'이 있는 두 개의 DataFrame df1과 'id'와 'value'가 있는 df2 간에 df1의 모든 행을 유지하는 왼쪽 조인 (left join) 을 어떻게 수행하나요?

답변:

pd.merge(df1, df2, on='id', how='left')를 사용합니다. 이렇게 하면 df1의 모든 행과 df2의 일치하는 행이 포함됩니다. df2에서 일치하는 항목을 찾을 수 없으면 df2의 열에 NaN 이 배치됩니다.


현재 문자열 (예: '$12.50') 로 저장된 DataFrame 의 'price' 열을 숫자 유형으로 어떻게 변환할 수 있나요?

답변:

먼저 문자열 조작을 사용하여 '$' 기호를 제거합니다: df['price'] = df['price'].str.replace('$', ''). 그런 다음 pd.to_numeric(df['price'])를 사용하여 열을 숫자 유형으로 변환합니다.


groupby 대신 pivot_table을 사용하는 시나리오를 설명해주세요.

답변:

pivot_table은 데이터를 재구성하고, 하나 이상의 열을 인덱스로, 하나 이상의 열을 열로, 집계 함수를 사용하여 스프레드시트 스타일의 피벗 테이블을 만드는 데 이상적입니다. groupby는 데이터를 그룹으로 분할하고 각 그룹에 함수를 적용하여 Series 또는 DataFrame 을 반환하는 데 더 일반적입니다.


DataFrame 의 각 행에 사용자 정의 함수를 효율적으로 적용하는 방법은 무엇인가요?

답변:

가장 효율적인 방법은 종종 람다 함수 또는 정의된 함수와 함께 df.apply(axis=1)를 사용하는 것입니다. 요소별 연산의 경우, 벡터화된 Pandas 연산 또는 NumPy 함수를 적용할 수 있다면 훨씬 더 빠릅니다.


특정 열 (예: 'customer_id' 및 'order_date') 을 기준으로 중복 행을 식별하고 제거해야 합니다. 어떻게 해야 하나요?

답변:

df.drop_duplicates(subset=['customer_id', 'order_date'], keep='first')를 사용합니다. keep='first'는 중복 세트의 첫 번째 발생을 유지하고, keep='last'는 마지막을 유지하며, keep=False는 모든 중복을 제거합니다.


시계열 DataFrame 의 'sales' 열에 대한 7 일 이동 평균을 어떻게 계산할 수 있나요?

답변:

먼저 DataFrame 이 날짜별로 정렬되었는지 확인합니다. 그런 다음 .rolling() 메서드를 사용합니다: df['sales_rolling_avg'] = df['sales'].rolling(window=7).mean(). 이렇게 하면 현재 값과 이전 6 개 값의 평균이 계산됩니다.


'category' 열이 있는 DataFrame 이 있습니다. 각 고유 범주의 발생 횟수를 어떻게 계산할 수 있나요?

답변:

'category' 열에 value_counts() 메서드를 사용합니다: df['category'].value_counts(). 이렇게 하면 고유 값이 인덱스이고 개수가 값인 Series 가 반환되며 내림차순으로 정렬됩니다.


성능 튜닝 및 모범 사례

Pandas 작업이 느린 일반적인 이유는 무엇인가요?

답변:

일반적인 이유로는 DataFrame 을 행별로 반복하는 것, 비효율적인 데이터 유형 (예: 숫자에 대한 'object'), 스와핑을 유발하는 과도한 메모리 사용, 벡터화되지 않은 연산 등이 있습니다. 대규모 데이터셋은 당연히 처리하는 데 더 오래 걸립니다.


Pandas DataFrame 으로 작업할 때 명시적 루프 (예: for 루프) 를 어떻게 피할 수 있나요?

답변:

Pandas 에서 제공하는 벡터화된 연산 (예: df['col'] * 2), 내장 메서드 (.apply(), .map(), .transform()), NumPy 함수를 사용하여 명시적 루프를 피하세요. 이러한 연산은 C 로 구현되어 훨씬 빠릅니다.


성능 및 사용 사례 측면에서 .apply(), .map(), .applymap()의 차이점을 설명해주세요.

답변:

.map()은 Series 수준의 요소별 연산에 사용됩니다. .apply()는 행별, 열별 또는 Series 에 대해 작동할 수 있습니다. .applymap()은 전체 DataFrame 에 대한 요소별 연산에 사용됩니다. 일반적으로 벡터화된 연산이 세 가지 모두보다 빠르지만, Series 의 경우 .map().apply()보다 빠른 경우가 많습니다.


Pandas 와 함께 Numba 또는 Cython을 사용해야 하는 경우는 언제인가요?

답변:

복잡하고 벡터화할 수 없는 연산이 성능 병목 현상을 일으킬 때 Numba 또는 Cython을 고려하세요. Python 코드를 기계 코드로 컴파일하여 수치 알고리즘의 속도를 크게 향상시키며, 특히 .apply() 또는 사용자 정의 함수와 함께 사용할 때 더욱 그렇습니다.


Pandas DataFrame 의 메모리 사용량을 어떻게 최적화할 수 있나요?

답변:

적절한 데이터 유형 (예: int8, float32, 저카디널리티 문자열의 경우 category) 을 사용하고, 불필요한 열을 삭제하고, 데이터셋이 메모리에 맞지 않을 정도로 클 경우 데이터를 청크 단위로 처리하여 메모리를 최적화하세요. .info(memory_usage='deep') 메서드는 메모리 사용량이 많은 부분을 식별하는 데 도움이 됩니다.


문자열 열에 category dtype 을 사용하는 이점은 무엇인가요?

답변:

category dtype 을 사용하면 고유한 값이 적은 (저카디널리티) 문자열 열의 메모리 사용량이 크게 줄어듭니다. 문자열을 정수 코드와 조회 테이블로 저장하여 그룹화 및 정렬과 같은 연산을 훨씬 빠르게 만듭니다.


대규모 CSV 파일을 Pandas 로 효율적으로 읽는 방법은 무엇인가요?

답변:

열에 대한 dtype을 지정하고, chunksize를 사용하여 반복적으로 읽고, usecols로 필요한 열만 선택하고, 샘플링을 위해 nrows를 설정하여 대규모 CSV 를 효율적으로 읽으세요. 이렇게 하면 전체 파일을 한 번에 메모리에 로드하는 것을 방지할 수 있습니다.


inplace=True의 중요성과 잠재적인 함정을 설명해주세요.

답변:

inplace=True는 새 DataFrame 을 반환하지 않고 DataFrame 을 직접 수정하여 잠재적으로 메모리를 절약할 수 있습니다. 그러나 체이닝 연산을 어렵고 덜 읽기 쉽게 만들 수 있으며, 명확성과 예상치 못한 부작용을 피하기 위해 최신 Pandas 에서는 일반적으로 권장되지 않습니다.


groupby 연산을 수행할 때 성능 고려 사항은 무엇인가요?

답변:

groupby의 성능 고려 사항에는 그룹 수, 집계 함수의 복잡성, 그룹화 키의 데이터 유형이 포함됩니다. 그룹화 키에 category dtype 을 사용하면 연산 속도를 크게 높일 수 있습니다. 벡터화된 대안이 있는 경우 사용자 정의 Python 함수 사용을 피하세요.


Pandas 코드를 프로파일링하여 성능 병목 현상을 식별하는 방법은 무엇인가요?

답변:

cProfile 또는 line_profiler와 같은 도구를 사용하여 Pandas 코드를 프로파일링하여 코드의 어느 부분이 가장 많은 시간을 소비하는지 식별하세요. Jupyter 의 %timeit%prun 매직 명령도 특정 줄 또는 셀의 빠른 프로파일링에 매우 유용합니다.


Pandas 코드 문제 해결 및 디버깅

예상대로 작동하지 않는 Pandas DataFrame 을 디버깅할 때 일반적으로 어떻게 시작하나요?

답변:

저는 일반적으로 DataFrame 의 info(), head(), tail(), dtypes를 검사하여 구조와 데이터 유형을 파악하는 것부터 시작합니다. df.shapedf.isnull().sum()을 확인하는 것도 누락된 값이나 예상치 못한 차원을 조기에 식별하는 데 도움이 됩니다.


SettingWithCopyWarning 경고가 발생합니다. 이것은 무엇을 의미하며 어떻게 해결하나요?

답변:

이 경고는 DataFrame 슬라이스의 뷰에서 작업 중일 수 있으며, 수정 사항이 원본 DataFrame 에 반영되지 않을 수 있음을 나타냅니다. 이를 해결하려면 체인 인덱싱에 .loc 또는 .iloc을 명시적으로 사용하여 복사본 또는 원본 DataFrame 에서 직접 작업하고 있는지 확인하세요. 예: df.loc[rows, cols] = value.


특히 대규모 데이터셋을 다룰 때 느린 Pandas 작업을 어떻게 디버깅하나요?

답변:

느린 작업의 경우 Jupyter 노트북에서 %%timeit 또는 Python 의 time 모듈을 사용하여 특정 코드 블록의 성능을 측정합니다. cProfile과 같은 프로파일러는 병목 현상을 정확히 찾아낼 수 있습니다. 종종 명시적 루프 대신 벡터화된 연산을 사용하거나 데이터 유형을 최적화하면 성능이 크게 향상됩니다.


작업을 수행하려고 하는데 Pandas 에서 TypeError가 발생합니다. 진단하는 첫 번째 단계는 무엇인가요?

답변:

TypeError는 종종 연산에 대한 데이터 유형 불일치를 나타냅니다. 제 첫 번째 단계는 df.dtypes를 사용하여 관련 열의 dtypes를 확인하는 것입니다. 그런 다음 관련된 모든 열이 호환되는 유형을 가지고 있는지 확인하고 필요한 경우 astype()을 사용하여 변환합니다.


NaN 값이 예상치 못한 동작을 유발할 수 있는 일반적인 시나리오를 설명하고 어떻게 처리할지 알려주세요.

답변:

NaN 값은 집계 (예: sum()은 무시할 수 있고 mean()은 왜곡될 수 있음) 또는 수학 연산을 수행할 때 문제를 일으킬 수 있습니다. df.isnull().sum()을 사용하여 이를 식별한 다음, 컨텍스트 및 데이터 무결성 요구 사항에 따라 적절한 값 (평균, 중앙값, 0) 으로 fillna()를 사용하거나 dropna()를 사용할지 결정합니다.


특정 열의 중복 행 또는 값을 확인하고 처리하는 방법은 무엇인가요?

답변:

중복 행을 확인하려면 df.duplicated().sum()을 사용합니다. 특정 열을 기준으로 중복을 식별하려면 df.duplicated(subset=['col1', 'col2']).sum()을 사용합니다. 중복을 제거하려면 df.drop_duplicates() 또는 df.drop_duplicates(subset=['col1'])을 사용합니다.


두 개의 DataFrame 을 병합하고 결과 DataFrame 의 행 수가 예상보다 적습니다. 무엇이 문제일 수 있나요?

답변:

이는 일반적으로 병합 키 또는 merge 작업의 how 매개변수에 문제가 있음을 나타냅니다. 키 열의 불일치 (예: 다른 철자, 선행/후행 공백, 데이터 유형) 를 확인하고 how 매개변수 (예: 'inner', 'left', 'right', 'outer') 가 원하는 결과와 일치하는지 확인합니다.


디버깅에서 pd.set_option()의 목적은 무엇이며 언제 사용해야 하나요?

답변:

pd.set_option()을 사용하면 Pandas 표시 옵션을 수정할 수 있으며, 이는 디버깅에 중요합니다. 대규모 DataFrame 또는 특정 값을 검사할 때 더 많은 행 (display.max_rows), 열 (display.max_columns) 을 표시하거나 열 내용의 잘림을 방지하기 위해 (display.max_colwidth) 사용합니다.


열에 액세스하려고 할 때 KeyError가 발생합니다. 가장 가능성 있는 이유는 무엇이며 어떻게 확인하나요?

답변:

KeyError는 일반적으로 액세스하려는 열 이름이 DataFrame 에 존재하지 않음을 의미합니다. df.columns를 출력하여 정확한 열 이름을 확인하고 사용 중인 열 이름의 오타, 대소문자 구분 문제 또는 선행/후행 공백을 확인하여 이를 확인합니다.


프로덕션 환경에서의 Pandas

사용 가능한 RAM 을 초과하는 대규모 데이터셋을 Pandas 로 어떻게 처리하나요?

답변:

RAM 을 초과하는 데이터셋의 경우, 데이터를 청크 단위로 처리하거나, Dask DataFrame 을 사용하거나, Pandas UDF 와 함께 PySpark 를 활용하거나, 데이터 유형을 최적화하는 (예: int64int32로) 등의 전략을 사용합니다. 데이터를 효율적으로 저장하는 것 (예: Parquet) 도 도움이 됩니다.


프로덕션 환경에서 Pandas 를 사용할 때 일반적인 성능 병목 현상은 무엇이며, 이를 어떻게 완화하나요?

답변:

일반적인 병목 현상으로는 for 루프, Python 함수를 사용하는 apply, 비효율적인 데이터 유형 등이 있습니다. 완화 방법에는 벡터화, 내장 Pandas 메서드 사용, 데이터 유형 최적화, 중요한 경로에 Numba 또는 Cython 과 같은 도구 고려 등이 있습니다.


프로덕션 파이프라인에서 Pandas DataFrame 으로 데이터를 수집할 때 데이터 품질 및 무결성을 보장하기 위한 전략을 설명해주세요.

답변:

전략에는 스키마 유효성 검사 (예: Pydantic 또는 Great Expectations 사용), 로딩 중 데이터 유형 강제 적용, 누락된 값 적절히 처리, 데이터 정리 규칙 구현 등이 포함됩니다. 정기적인 데이터 프로파일링 및 이상 탐지도 중요합니다.


프로덕션 환경에서 Pandas 기반 애플리케이션의 종속성 및 환경을 어떻게 관리하나요?

답변:

종속성 관리는 일반적으로 requirements.txt 또는 Pipfile.lock과 함께 pip를 사용하거나 environment.yml과 함께 conda를 사용하여 수행됩니다. Docker 와 같은 컨테이너화 기술은 배포를 위한 격리되고 재현 가능한 환경을 만드는 데 사용됩니다.


프로덕션 워크로드에 대해 Pandas 대신 다른 데이터 처리 프레임워크 (예: Dask, Spark) 를 선택해야 하는 경우는 언제인가요?

답변:

데이터셋이 사용 가능한 RAM 을 지속적으로 초과하여 분산 컴퓨팅이 필요하거나 처리가 여러 머신에 걸쳐 수평적으로 확장되어야 하는 경우 Dask 또는 Spark 를 선택합니다. Pandas 는 단일 머신, 인메모리 작업에 가장 적합합니다.


프로덕션 환경에서 Pandas 작업을 어떻게 로깅하고 모니터링하나요?

답변:

로깅은 Python 의 logging 모듈을 사용하여 데이터 변환, 오류 및 성능 메트릭을 추적하도록 구현할 수 있습니다. 모니터링은 Prometheus 또는 Grafana 와 같은 도구를 사용하여 리소스 사용량 (CPU, RAM) 및 핵심 성과 지표 (KPI) 를 추적하는 것을 포함합니다.


프로덕션 Pandas 스크립트에서 오류 처리 및 안정성에 대해 어떤 고려 사항을 가지고 있나요?

답변:

안정성에는 예상되는 오류 (예: 파일 없음, 데이터 구문 분석 문제) 에 대한 try-except 블록 사용, 입력 유효성 검사, 점진적 성능 저하 또는 재시도 메커니즘 구현이 포함됩니다. 명확한 오류 메시지와 로깅은 디버깅에 필수적입니다.


Pandas 기반 데이터 파이프라인의 재현성을 어떻게 보장하나요?

답변:

재현성은 정확한 라이브러리 버전 고정 (예: pandas==1.3.5), Docker 또는 Conda 와 같은 도구를 사용한 환경 관리, 모든 코드 및 구성의 버전 제어를 통해 보장됩니다. 데이터 소스 및 처리 단계를 문서화하는 것도 중요합니다.


프로덕션에서 Pandas 로 처리된 데이터를 저장하기 위해 Parquet 와 CSV 사용의 장단점을 논의해주세요.

답변:

Parquet 는 더 나은 압축, 특정 열에 대한 더 빠른 읽기/쓰기, 스키마 진화를 제공하는 열 기반 이진 형식입니다. CSV 는 사람이 읽을 수 있고 더 간단하지만 대규모 데이터셋에는 덜 효율적입니다. Parquet 는 일반적으로 프로덕션에서 성능 및 저장 효율성을 위해 선호됩니다.


프로덕션 애플리케이션을 위해 Pandas 에서 datetime 객체를 다룰 때 시간대 인식 및 현지화는 어떻게 처리하나요?

답변:

항상 datetime 을 UTC 로 저장하고 표시할 때만 로컬 시간대로 변환합니다. Pandas 의 tz_localize()tz_convert() 메서드가 이를 위해 사용됩니다. 모호성을 피하고 시스템 간 일관성을 보장하기 위해 시간대 정보에 명시적으로 지정하세요.


역할별 Pandas 애플리케이션 (예: 데이터 분석가, 데이터 과학자, ML 엔지니어)

데이터 분석가로서 고객 데이터가 포함된 CSV 파일을 받았습니다. 'email' 및 'phone_number'와 같은 주요 열에서 누락된 값을 신속하게 식별하고 요약하기 위해 Pandas 를 어떻게 사용하시겠습니까?

답변:

df[['email', 'phone_number']].isnull().sum()을 사용하여 열별 누락된 값의 수를 계산합니다. 비율을 구하려면 len(df)로 나눕니다. 이를 통해 보고를 위한 데이터 품질 문제를 신속하게 파악할 수 있습니다.


데이터 과학자로서 머신러닝을 위해 데이터셋을 준비하고 있습니다. 'product_category'와 같은 범주형 열에 대해 원 - 핫 인코딩 (one-hot encoding) 을 수행한 다음, 이를 원본 DataFrame 에 다시 병합하기 위해 Pandas 를 어떻게 사용하시겠습니까?

답변:

pd.get_dummies(df['product_category'], prefix='category')를 사용하여 원 - 핫 인코딩된 DataFrame 을 생성합니다. 그런 다음 pd.concat([df, one_hot_df], axis=1)을 사용하고 원본 'product_category' 열을 삭제하여 통합합니다.


ML 엔지니어는 모델 학습을 위해 대규모 데이터셋 (10GB 이상) 을 로드해야 합니다. 메모리 제약을 고려하여 Pandas 를 사용하여 이 데이터를 효율적으로 로드하고 잠재적으로 샘플링하려면 어떻게 하시겠습니까?

답변:

대규모 파일의 경우 pd.read_csv(..., chunksize=...)를 사용하여 청크 단위로 처리하거나 dtype을 지정하여 메모리를 최적화합니다. 샘플링의 경우, 하위 집합 또는 청크를 로드한 후 df.sample(frac=0.1) 또는 df.sample(n=100000)을 사용합니다.


데이터 분석가로서 일별 판매 DataFrame 에서 월별 판매 추세를 계산해야 합니다. 'sale_date' 열과 'revenue' 열이 있다고 가정할 때 Pandas 를 사용하여 이를 어떻게 달성하시겠습니까?

답변:

먼저 pd.to_datetime()을 사용하여 'sale_date'가 datetime 인지 확인합니다. 그런 다음 'sale_date'를 인덱스로 설정하고 df['revenue'].resample('M').sum()을 사용하여 월별 수익을 집계합니다.


데이터 과학자가 특징 공학 (feature engineering) 을 수행하고 있습니다. 'age' 열에서 'age_group'이라는 새 특징을 생성하여 고객을 '0-18', '19-35', '36-60', '60+'로 분류하기 위해 Pandas 를 어떻게 사용하시겠습니까?

답변:

pd.cut(df['age'], bins=[0, 18, 35, 60, np.inf], labels=['0-18', '19-35', '36-60', '60+'], right=True)를 사용합니다. 이는 수치 데이터를 지정된 범주로 효율적으로 그룹화합니다.


ML 엔지니어는 대상 변수 'is_fraud'에 대한 계층화를 보장하면서 Pandas DataFrame 을 학습, 검증 및 테스트 세트로 분할해야 합니다. Pandas 와 scikit-learn 을 사용하여 이 작업에 어떻게 접근하시겠습니까?

답변:

scikit-learn 의 train_test_split을 사용하고 stratify=df['is_fraud']를 전달하여 클래스 균형을 보장합니다. 두 번 호출합니다. 먼저 train/temp용으로, 그런 다음 temp 를 validation/test용으로 호출합니다.


데이터 분석가로서 'customer_id'가 있는 customers DataFrame 과 'customer_id' 및 'order_id'가 있는 orders DataFrame 을 병합해야 합니다. 주문을 한 고객만 보려면 내부 조인 (inner join) 을 어떻게 수행하시겠습니까?

답변:

pd.merge(customers_df, orders_df, on='customer_id', how='inner')를 사용합니다. 이는 공통 'customer_id' 열을 기반으로 DataFrame 을 효율적으로 결합하여 일치하는 행만 유지합니다.


데이터 과학자가 시계열 데이터를 다루고 있으며 'temperature' 열의 7 일 이동 평균을 계산해야 합니다. Pandas 에서 이를 어떻게 수행하시겠습니까?

답변:

datetime 인덱스가 있다고 가정하면 df['temperature'].rolling(window='7D').mean()을 사용합니다. 인덱싱되지 않은 경우 먼저 datetime 열을 인덱스로 설정합니다.


ML 엔지니어는 특정 열 순서와 데이터 유형이 필요한 모델을 배포하고 있습니다. 모델에 전달하기 전에 수신된 추론 데이터에 이 구조를 적용하기 위해 Pandas 를 어떻게 사용하시겠습니까?

답변:

먼저 df = df[expected_column_order]를 사용하여 DataFrame 의 인덱스를 재설정하여 열 순서를 적용합니다. 그런 다음 df = df.astype(expected_dtypes)를 사용하여 열을 필요한 데이터 유형으로 캐스팅합니다.


데이터 분석가로서 'region' 및 'product_type'별로 'sales'를 요약하기 위해 DataFrame 을 피벗해야 합니다. 이를 위해 pivot_table을 어떻게 사용하시겠습니까?

답변:

pd.pivot_table(df, values='sales', index='region', columns='product_type', aggfunc='sum')을 사용합니다. 이는 지역을 행으로, 제품 유형을 열로, 총 판매량을 값으로 하는 요약 테이블을 생성합니다.


요약

데이터 과학 면접을 위한 Pandas 숙달은 준비와 끈기가 보상하는 여정입니다. 이러한 질문들을 성실히 검토하고 기본 개념을 이해함으로써, 일반적인 문제들을 자신감 있게 해결하고 데이터 조작 및 분석 능력을 보여줄 수 있는 지식을 갖추게 되었습니다.

데이터 과학 분야는 끊임없이 진화하고 있다는 점을 기억하십시오. 새로운 기능을 계속 탐색하고, 다양한 데이터셋으로 연습하며, Pandas 커뮤니티와 교류하십시오. 지속적인 학습에 대한 여러분의 헌신은 면접 성과를 향상시킬 뿐만 아니라 데이터 전문가로서의 전문성을 공고히 할 것입니다. 행운을 빕니다!