Q1. DataFrame과 Series의 차이 설명으로 가장 알맞은 것은?
- DataFrame은 표 전체이고, Series는 보통 한 개의 열이나 1차원 데이터예요.
- DataFrame은 숫자만 담고, Series는 문자만 담아요.
- DataFrame은 한 행만 담고, Series는 여러 표를 묶어요.
- DataFrame과 Series는 이름만 다르고 완전히 같은 구조예요.
Q2. loc와 iloc의 차이로 가장 알맞은 것은?
- loc는 위치 번호 기반이고, iloc는 문자열 검색용이에요.
- loc는 레이블 기반이고, iloc는 위치 기반이에요.
- loc는 열 선택만 가능하고, iloc는 행 선택만 가능해요.
- loc와 iloc는 항상 같은 결과만 내요.
Q3. 문자열 열에서 "Din"이 포함된 행만 찾고 싶어요. 가장 알맞은 코드는?
1
df[df["time"].contains("Din")]
2
df[df["time"] == "Din"]
3
df[df["time"].str.contains("Din", na=False)]
4
df[df["time"].isnull("Din")]
--
정답 : 3
str.contains() -> 문자열 포함 여부 검사
na = False -> 결측치(NaN) 오류 방지
Q4. TotalCharges 열에 결측치가 있는지 먼저 확인하고 싶을 때 가장 알맞은 선택은?
- dropna()
- fillna()
- isnull().sum()
- astype(float)
isnull() -> 결측치 여부 확인
sum() -> 각 열의 결측치 개수 계산
Q5. .copy()가 특히 필요한 상황으로 가장 알맞은 것은?
- 원본 DataFrame을 유지한 채 필터링 결과에 새 열을 안전하게 추가하고 싶을 때예요.
- 열 이름만 출력하고 싶을 때예요.
- DataFrame을 바로 화면에 보여주고 싶을 때예요.
- 모든 결측치를 자동으로 삭제하고 싶을 때예요.
Q6. 코드 해석 — DataFrame 생성 + columns/dtypes
다음 코드를 읽고 답해 주세요.
data = {
"고객ID": ["C001","C002","C003"],
"나이": [25,31,28],
"가입여부": [True, False, True]
}
df = pd.DataFrame(data)
print(df.columns.tolist())
print(df.dtypes)
문제
- df.columns.tolist() 결과에 어떤 값들이 들어가나요?
- ['고객ID', '나이', '가입여부']
- df.dtypes를 출력했을 때 각 열의 dtype은 무엇인가요?
- 고객 나이 -> object
- 나이 -> int64
- 가입여부 -> bool
Q7. 코드 해석 — loc vs iloc 슬라이싱 비교
다음 코드를 읽고 답해 주세요.
df = pd.DataFrame({
"도시":["서울","부산","대전"],
"매출":[100,200,150],
"고객수":[10,20,15]
}, index=["a","b","c"])
print(df.loc["b":"c", ["도시","매출"]])
print(df.iloc[0:2, 1:3])
문제
- 첫 번째 출력에서 어떤 행/열이 선택되나요?
- 레이블 b~c까지의 행 (양 끝 포함)에서 도시, 매출 열만 선택된다.
- 두 번째 출력에서 어떤 위치 범위가 선택되나요?
- 위치 기준으로 행 0~1번(끝값 미포함) 열 1~2번(끝값 미포함)이 선택된다.
- loc와 iloc가 각각 무엇을 기준으로 동작하는지 한 문장으로 정리해 주세요.
- loc는 인덱스 레이블(이름)기준으로 데이터를 선택하고, iloc는 0부터 시작하는 정수 위치 기준으로 선택이된다.
- loc는 끝 레이블을 포함하지만, iloc는 끝 위치를 포함하지 않는다.
Q8. 코드 해석 — SettingWithCopyWarning 원인과 안전한 수정
다음 코드를 읽고 답해 주세요.
df = pd.DataFrame({
"고객":["A","B","C"],
"요금":[30,80,90],
"지역":["서울","부산","부산"]
})
high_fee = df[df["요금"] >= 80]
high_fee["등급"] = "주의"
문제
- SettingWithCopyWarning이 발생할 수 있는 이유는?
- df[df['요금'] >= 80] 으로 만들어진 high_fee는 원본 df의 복사본인지 뷰인지 알 수 없다. 여기에 새 열을 추가하면, pandas가 원본을 수정하려는지 복사본을 수정하려는 건지 모르겠다는 경고문을 내뱉는다.
- 어느 부분이 원본/복사본 경계를 헷갈리게 만드나요?
- high_fee = df[df['요금'] >= 80] 필터링 결과가 내부적으로 뷰인지 복사본인지 확정되지 않은 상태인데, 다음 값에 값을 할당하기 때문
- 더 안전하게 쓰려면 어떻게 고치면 좋을지 방향을 설명해 주세요
high_fee = df[df['요금'] >= 80 ].copy()
high_fee['등급'] ='주의'
뷰(View)는 원본 데이터를 복사하지 않고, 원본을 '참조'하는 것을 말한다.
내가 보기에는 df[df['요금'] >= 80]은 뷰인거 같은데 왜 pandas가 헷갈려하는지 궁금해서 찾아봤는데, Pandas내부 최적화 문제라고 한다. Pandas는 필터링 시 상황에 따라 자동으로 뷰를 만들지, 복사본을 만들지 내부엔진이 알아서 최적화 하므로 .copy()를 사용해서 무조건 복사본이야 라고 명확히 선언해 주는게 가장 좋다.
그리고 내부적으로 조건 필터링은 뽑인 행이 메모리상에 흩어져 있을 가능성이 있어서 복사본이 된다고 한다(띄엄띄엄한 데이터는 뷰로 만들 수 없음) 그래서 df[df['요금'] >= 80] 은 보통 복사본이라고 한다.
슬라이싱이나, 하나 선택 이런 경우는 보통 뷰라고 한다.
항상 그런게 아니므로 Pandas버전이나 데이터 구조, 메모리 상태를 확인해야한다.
Q9. dropna()와 fillna() 중 언제 어떤 것을 선택하는지 한 문장으로 설명해 주세요.
결측치를 제거해도 분석에 영향이 없을 만큼 데이터가 충분할 때 -> dropna()
결측치가 많거나 해당 행을 버리면 중요한 정보가 손실 될 때는 평균, 중앙값, 특정 값으로 채워주는 fillna()를 선택한다.
Q10. Telco 데이터의 TotalCharges 열을 숫자형으로 바꿀 때 pd.to_numeric(errors="coerce")를 쓰는 이유를 한 문장으로 설명해 주세요.
TotalCharges 열에는 공백 문자열처럼 숫자로 변환할 수 없는 값이 섞여 있을 수 있는데, errors="coerce"를 지정하면 변환에 실패한 값을 오류로 중단하지 않고 NaN으로 처리해 주어 이후 결측치 처리 단계로 자연스럽게 이어갈 수 있기 때문
'Programing' 카테고리의 다른 글
| [error] git .lock 파일 삭제하기 (0) | 2026.05.22 |
|---|---|
| [error] name '__file__' is not defined (0) | 2026.05.08 |
| OpenCV와 Python을 활용한 명함 이미지 보정 (0) | 2026.05.07 |
| 영상처리 입문 (0) | 2026.05.06 |
| SQLAlchemy Column vs Mapped (0) | 2026.04.30 |