Data Science/Pandas

Pandas. df[...]와 .loc[...]의 행 또는 열 선택 기준

워로디스 2026. 9. 28. 22:56

pandas가 헷갈리는 이유는 비슷한 대괄호 문법이 상황에 따라 다르게 해석되기 때문입니다. 핵심은 df[...]와 .loc[...]의 해석 기준이 서로 다르다는 점입니다.

1. df[...]는 안에 들어온 값의 종류에 따라 의미가 달라진다

df['Fare']

'Fare'는 열 이름이므로 열 선택입니다.

df[['Fare', 'Age']]

열 이름들의 리스트이므로 역시 열 선택입니다.

반면:

df[df['Fare'] < 3000]

먼저

df['Fare'] < 3000

의 결과는 다음과 같은 Boolean Series입니다.

0     True
1     True
2     False
3     True
...

그리고 pandas는

df[boolean_series]

형태를 만나면 Boolean 값에 따라 행을 필터링합니다.

따라서:

df[df['Fare'] < 3000]

은

Fare 값이 3000보다 작은 행들을 선택

한다는 뜻입니다.

즉 df[...]는 다음처럼 해석됩니다.

표현 의미
df['Fare'] 열 선택
df[['Fare', 'Age']] 여러 열 선택
df[boolean_series] 행 선택

그래서 df[...]는 항상 행 선택 또는 항상 열 선택인 문법이 아닙니다.

2. .loc은 자리로 행과 열을 구분한다

.loc의 기본 구조는 다음과 같습니다.

df.loc[행선택, 열선택]

즉:

df.loc[ A , B ]
        ↑   ↑
        행  열

예를 들어:

df.loc[:, 'Fare']

는

  • : → 모든 행
  • 'Fare' → Fare 열

이므로 Fare 열을 선택합니다.

반대로:

df.loc[df['Fare'] < 3000, :]

는

  • df['Fare'] < 3000 → 조건에 맞는 행
  • : → 모든 열

이므로 조건에 맞는 행들을 선택합니다.

3. .loc도 두 번째 항목은 생략할 수 있다

다음 두 표현은 같은 의미입니다.

df.loc[df['Fare'] < 3000]
df.loc[df['Fare'] < 3000, :]

.loc[...] 안에 하나만 쓰면 첫 번째 자리인 행 선택으로 해석합니다.

즉:

df.loc[A]

는 사실상

df.loc[A, :]

입니다.

따라서:

df.loc['Fare']

라고 하면 'Fare'를 열 이름으로 보는 것이 아니라 행 인덱스의 label로 해석합니다.

열만 고르려면 반드시:

df.loc[:, 'Fare']

처럼 써야 합니다.

4. df[...]와 .loc[...]의 핵심 차이

가장 중요한 차이는 이것입니다.

df[...]

안에 들어온 객체의 종류를 보고 pandas가 의미를 판단합니다.

df['Fare']       # 문자열 → 열df[['A', 'B']]   # 열 이름 리스트 → 열df[mask]         # Boolean Series → 행

.loc[...]

쉼표 기준 자리로 행과 열을 판단합니다.

df.loc[행, 열]

따라서:

df.loc[mask]          # 행df.loc[:, 'Fare']     # 열df.loc[mask, 'Fare']  # 행 조건 + 열 선택

5. 기억하기 좋은 기준

df[...]는:

무엇을 넣었는지에 따라 행/열의 의미가 바뀐다.

.loc[...]는:

어느 자리에 넣었는지에 따라 행/열이 결정된다.

그래서 pandas 코드를 읽을 때는 .loc을 다음 구조로 기억하면 가장 편합니다.

df.loc[행, 열]

그리고 하나만 있으면:

df.loc[행]

즉 열 부분이 생략된 것이라고 생각하면 됩니다.

참고로 .loc[...] 안의 행선택, 열선택을 엄밀하게는 함수의 파라미터(parameter) 라기보다는 인덱서(indexer) 라고 부르는 편이 더 정확합니다.

반응형