[Pandas] DataFrame β‘€ loc

Hunie_07Β·2026λ…„ 3μ›” 17일

Pandas

λͺ©λ‘ 보기
10/12
post-thumbnail

πŸ“Œ DataFrame Indexer

DataFrame β‘’ 인덱싱 μ—μ„œλŠ” μΈλ±μ„œλ₯Ό ν™œμš©ν•˜μ§€ μ•Šμ€ μ ‘κ·Ό 방법을 μ•Œμ•„λ³΄μ•˜λŠ”λ°, μ΄λ²ˆμ—λŠ” μΈλ±μ„œμ— κ΄€ν•˜μ—¬ μ‚΄νŽ΄λ³΄μž.

λ°μ΄ν„°ν”„λ ˆμž„μ˜ κΈ°λ³Έ 인덱싱

  • 열인덱싱
    • ν•˜λ‚˜μ˜ μ—΄λ§Œ 선택 : df['열이름']
    • μ—¬λŸ¬ 개 μ—΄ 선택 : df[['열이름1', '열이름2',...]]
  • 행인덱싱 : μ—°μ†λœ κ΅¬κ°„μ˜ 행데이터 선택(μŠ¬λΌμ΄μ‹±)
    • df['ν–‰_μ‹œμž‘μœ„μΉ˜':'ν–‰_λμœ„μΉ˜']
  • κ°œλ³„μš”μ†Œ μ ‘κ·Ό : μ„ νƒν•œ μ—΄μ—μ„œ μ§€μ •λœ κ΅¬κ°„μ˜ 행데이터 선택
    • df['열이름']['ν–‰_μ‹œμž‘μœ„μΉ˜':'ν–‰_λμœ„μΉ˜']
    • df['열이름']['μ‹œμž‘_행이름':'끝_행이름']

λ°μ΄ν„°ν”„λ ˆμž„μ˜ νŠΉλ³„ν•œ μΈλ±μ„œ(indexer) : loc , iloc

  • numpy와 같이 μ‰Όν‘œ(,)λ₯Ό μ‚¬μš©ν•˜μ—¬ ν–‰κ³Ό 열을 λ™μ‹œμ— μΈλ±μ‹±ν•˜λŠ” 2차원 인덱싱
  • [ν–‰ 인덱슀, μ—΄ 인덱슀] ν˜•μ‹
  • loc : 라벨값 기반의 2차원 인덱싱(λͺ…μΉ­κΈ°λ°˜ 인덱싱)
  • iloc : μˆœμ„œλ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜ 기반의 2차원 인덱싱(μœ„μΉ˜κΈ°λ°˜ 인덱싱)

πŸ“Œ loc μΈλ±μ„œ

λͺ…μΉ­κΈ°λ°˜ μΈλ±μ„œ

  • df.loc[행인덱싱 κ°’]
  • df.loc[행인덱싱 κ°’,열인덱싱 κ°’]

인덱싱 κ°’ μœ ν˜•

  • 인덱슀 데이터 : [index name] λ˜λŠ” [index_name, column name]
  • 인덱슀 데이터 슬라이슀
  • 같은 ν–‰ 인덱슀λ₯Ό κ°–λŠ” Boolean μ‹œλ¦¬μ¦ˆ(ν–‰ 인덱싱인 경우)
    • 쑰건으둜 μΆ”μΆœ κ°€λŠ₯(뢈린 인덱싱)
  • μœ„ 값을 λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜

κ²°κ³Όκ°’ λ™μ‹œ 좜λ ₯ μ„€μ •

from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity='all'

μ˜ˆμ‹œ λ°μ΄ν„°ν”„λ ˆμž„

df = pd.DataFrame(data=np.arange(10, 22).reshape(3, 4),
                  index='a b c'.split(),
                  columns='A B C D'.split())
df

- 좜λ ₯


1️⃣ ν–‰ 선택

  • ν˜•μ‹ : dataframe.loc['ν–‰μΈλ±μŠ€κ°’']
# 'a' ν–‰ 선택
df['a': 'a']    # λ°μ΄ν„°ν”„λ ˆμž„
df.loc['a']     # μ‹œλ¦¬μ¦ˆ
df.loc[['a']]	# λ°μ΄ν„°ν”„λ ˆμž„

- 좜λ ₯

A    10
B    11
C    12
D    13
Name: a, dtype: int64

2️⃣ μ—¬λŸ¬ ν–‰ 선택

β‘  ν–‰μΈλ±μŠ€ μŠ¬λΌμ΄μ‹±

  • ν˜•μ‹: dataFrame.loc['처음 ν–‰μΈλ±μŠ€κ°’' : 'λν–‰μΈλ±μŠ€κ°’']
# aν–‰λΆ€ν„° cν–‰κΉŒμ§€
df.loc['a': 'c']

- 좜λ ₯


# aν–‰κ³Ό cν–‰
df.loc['a': 'c']

- 좜λ ₯


ν–‰μΈλ±μŠ€κ°€ μ •μˆ˜μœ„μΉ˜μΈλ±μŠ€μΈ 경우

μ˜ˆμ‹œ λ°μ΄ν„°ν”„λ ˆμž„

df2 = pd.DataFrame(data=np.arange(10, 26).reshape(4, 4),
                   columns='a b c d'.split())
df2

- 좜λ ₯


# '2' ν–‰ 
df2.loc[2]

- 좜λ ₯

a    18
b    19
c    20
d    21
Name: 2, dtype: int64

# '2' ν–‰μ „κΉŒμ§€
df2[:2]

- 좜λ ₯


β‘‘ ν–‰μΈλ±μŠ€ 데이터λ₯Ό 리슀트둜 μ§€μ •

  • ν˜•μ‹: dataFrame[[행이름1, 행이름2,... ]]
    • μ—¬λŸ¬ ν–‰ μ„ νƒμ‹œ μΈλ±μ„œ 데이터λ₯Ό 리슀트둜 μ‚¬μš©
    • λ°˜ν™˜κ°’μ€ λ°μ΄ν„°ν”„λ ˆμž„
# '2'ν–‰κ³Ό '0'ν–‰
df2.loc[[2, 0]]

- 좜λ ₯


β‘’ Boolean Indexing으둜 ν–‰ 선택

  • Ex) df 의 Aμ—΄ 의 값이 15 보닀 큰 ν–‰ μΆ”μΆœ
# κΈ°λ³Έ 인덱싱 μ‚¬μš©
df[df['A'] > 15]
  • loc 은 ν–‰ μš°μ„  μΈλ±μ„œμ΄κΈ°μ— μ•ž μš”μ†Œμ— ν–‰ 전체 : , λ’€ μš”μ†Œμ— 선택 μ—΄ 'A' λ₯Ό μž…λ ₯ν•œλ‹€.
# loc μΈλ±μ„œ μ‚¬μš©
df[df.loc[:, 'A'] > 15]

- 좜λ ₯


β‘£ 인덱슀 λŒ€μ‹  인덱슀 값을 λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜ μ‚¬μš©

  • λ‹€μŒκ³Ό 같은 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ ν•΄λ‹Ή 쑰건 μΆ©μ‘± μ—¬λΆ€λ‘œ True / False λ₯Ό λ°˜ν™˜ν•˜μ—¬ loc μž…λ ₯값에 λ„£μ–΄μ£Όλ©΄ ν•΄λ‹Ήν•˜λŠ” 값을 좜λ ₯ν•˜κ²Œ λœλ‹€.
# 인덱싱을 μœ„ν•œ ν•¨μˆ˜ μž‘μ„±
def sel_row(df):
    return df.A < 15
sel_row(df)

- 좜λ ₯

a     True
b     True
c    False
Name: A, dtype: bool

df.loc[sel_row(df)]

- 좜λ ₯


3️⃣ μ—΄ 선택

  • ν˜•μ‹: dataFrame.loc[:, 'ν–‰μΈλ±μŠ€κ°’']
# 'A' μ—΄ 선택
df['A']
df.loc[:, 'A']

- 좜λ ₯

a    10
b    14
c    18
Name: A, dtype: int64

μ—¬λŸ¬ μ—΄ 좜λ ₯

df.loc[:, ['B', 'C']]

- 좜λ ₯


# 'A' μ—΄ 좜λ ₯
df.loc[:][['A']]	# λ°μ΄ν„°ν”„λ ˆμž„
df.loc[:]['A']		# μ‹œλ¦¬μ¦ˆ
df.loc[:, 'A']		# μ‹œλ¦¬μ¦ˆ

- 좜λ ₯

a    10
b    14
c    18
Name: A, dtype: int64

a    10
b    14
c    18
Name: A, dtype: int64

4️⃣ κ°œλ³„ μš”μ†Œ 선택

  • μΈλ±μ‹±μœΌλ‘œ ν–‰κ³Ό 열을 λͺ¨λ‘ λ°›λŠ” 경우
  • ν˜•μ‹ : df.loc[ν–‰μΈλ±μŠ€, μ—΄μΈλ±μŠ€]
    • 라벨(λ¬Έμžμ—΄)인덱슀 μ‚¬μš©
# 'a' ν–‰μ˜ 'A' μ—΄μ˜ κ°’
# κΈ°λ³Έ 인덱싱 μ‚¬μš©
df['A']['a': 'a']

# loc μΈλ±μ„œ μ‚¬μš©
df.loc['a', 'A']

- 좜λ ₯

a    10
Name: A, dtype: int64

np.int64(10)

κ°œλ³„ μš”μ†Œ κ°’ μˆ˜μ •

  • κΈ°λ³Έ 인덱싱을 μ‚¬μš©ν•˜λ©΄ μˆ˜μ •μ΄ λΆˆκ°€ν•˜λ©°, λ‹€μŒκ³Ό 같은 였λ₯˜κ°€ λ°œμƒν•œλ‹€.
ChainedAssignmentError: A value is being set on a copy of a DataFrame or Series through chained assignment.
Such chained assignment never works to update the original DataFrame or Series, because the intermediate object on which we are setting values always behaves as a copy (due to Copy-on-Write).

Try using '.loc[row_indexer, col_indexer] = value' instead, to perform the assignment in a single step.
  • λ”°λΌμ„œ loc μΈλ±μ„œλ₯Ό μ‚¬μš©ν•˜μ—¬ 값을 μˆ˜μ •ν•œλ‹€.
# κΈ°λ³Έ 인덱싱 μ‚¬μš©
df['A']['a': 'a'] = 100     # λ°μ΄ν„°ν”„λ ˆμž„ ν˜•μ‹μ΄λ―€λ‘œ κ°’ μˆ˜μ • λΆˆκ°€

# loc μΈλ±μ„œ μ‚¬μš©
df.loc['a', 'A'] = 100
df

- 좜λ ₯


# aν–‰ Bμ—΄ / cν–‰ Cμ—΄ 선택
df.loc[['a', 'c']][['B', 'C']]
df.loc[['a', 'c'], ['B', 'C']]

- 좜λ ₯


5️⃣ λ©€ν‹°μΈλ±μŠ€(multi-index)λ₯Ό κ°–λŠ” λ°μ΄ν„°ν”„λ ˆμž„

  • 인덱슀의 차원이 2차원 이상인 경우: 닀차원 인덱슀

μ˜ˆμ‹œ λ°μ΄ν„°ν”„λ ˆμž„1

df3 = pd.DataFrame(data=np.arange(10, 22).reshape(3, 4),
                   index=['a b c'.split()],
                   columns=['A', 'B', 'C', 'D'])
df3

- 좜λ ₯


# aν–‰λΆ€ν„° cν–‰κΉŒμ§€
df3.loc['a': 'c']

- 좜λ ₯


μ˜ˆμ‹œ λ°μ΄ν„°ν”„λ ˆμž„2

df4 = pd.DataFrame(data=np.arange(10, 22).reshape(4, 3),
                   index=[['a', 'a', 'b', 'b'], [1, 2, 1, 2]],
                   columns=['A', 'B', 'C'])
df4

- 좜λ ₯


# ('a', 1)ν–‰, ('b', 1)ν–‰ 선택
df4.loc[[('a', 1), ('b', 1)]]

- 좜λ ₯

0개의 λŒ“κΈ€