Pandas에서
loc
와iloc
은 DataFrame이나 Series에서 특정 데이터나 행, 열을 선택할 때 사용하는 중요한 기능입니다.
loc
iloc
loc
vs iloc
구분 | 의미 | 사용하는 값 | 끝 값 포함 여부 |
---|---|---|---|
loc | label-based indexing (라벨 기준) | 행/열의 이름(label) | ✅ (포함) |
iloc | integer-based indexing (정수 위치 기준) | 정수 인덱스(0, 1, 2, ...) | ❌ (포함 안 함) |
import pandas as pd
df = pd.DataFrame({
"A": ["A0", "A1", "A2"],
"B": ["B0", "B1", "B2"],
"C": ["C0", "C1", "C2"]
}, index=["row1", "row2", "row3"])
A B C
row1 A0 B0 C0
row2 A1 B1 C1
row3 A2 B2 C2
loc
(라벨로 선택)df.loc["row1"]
df.loc[["row1", "row2"], ["A", "B"]]
df.loc["row1":"row2", "A":"B"]
iloc
(정수 위치로 선택)df.iloc[0] # 첫 번째 행
df.iloc[[0, 1], [0, 1]]
df.iloc[0:2, 0:2]
loc
은 인덱스(행, 열의 이름)로 데이터를 찾으며, 슬라이싱에서 끝이 포함됩니다.iloc
은 0부터 시작하는 정수 위치로 찾으며, 슬라이싱에서 끝이 포함되지 않습니다.Pandas에서는
Series
와Index
에 대해 특정 데이터 타입에 특화된 연산을 벡터화하여 수행할 수 있게 도와주는 Accessor (.str
,.dt
,.cat
등) 를 제공합니다.이 Accessor는 마치 데이터 타입 전용 도구상자라고 볼 수 있습니다.
Series
또는 Index
에서만 사용 가능합니다.Accessor | 대상 타입 | 설명 | 사용 예시 |
---|---|---|---|
.str | 문자열 (object , string ) | 문자열 관련 메서드 제공 | s.str.replace(' ', '_') |
.dt | 날짜/시간 (datetime64 ) | 날짜/시간 정보 추출 및 포맷팅 | s.dt.year , s.dt.day_name() |
.cat | 카테고리 (category ) | 카테고리 관리 및 처리 | s.cat.codes , s.cat.remove_unused_categories() |
.sparse | 희소 데이터 (SparseDtype ) | 메모리 절약형 희소 데이터 연산 | s.sparse.density |
.flags | Series/DataFrame | 내부 설정값 확인 및 설정 | s.flags.allows_duplicate_labels |
.array | ExtensionArray-backed Series | 내부 배열에 직접 접근 | s.array (예: nullable int, string 등) |
.str
s = pd.Series(['apple pie', 'banana bread'])
s.str.replace(' ', '_')
# 결과: ['apple_pie', 'banana_bread']
import inspect
df = pd.DataFrame({"data": ["Hello", "World"]})
for name in [name for name, object in inspect.getmembers(df['data'].str) if not name.startswith("_")]:
print(f"- {name}")
.dt
s = pd.Series(pd.to_datetime(['2023-01-01', '2024-03-23']))
s.dt.year
# 결과: [2023, 2024]
s.dt.day_name()
# 결과: ['Sunday', 'Saturday']
import inspect
df = pd.DataFrame({"data": ["2024-03-02", "2024-04-02"]})
df['data'] = pd.to_datetime(df['data'])
for name in [name for name, object in inspect.getmembers(df['data'].dt) if not name.startswith("_")]:
print(f"- {name}")
.cat
s = pd.Series(['red', 'blue', 'green'], dtype='category')
s.cat.codes
# 결과: [1, 0, 2]
import inspect
df = pd.DataFrame({"data": ["a", "b", "c", "a", "c"]}).astype('category')
for name in [name for name, object in inspect.getmembers(df['data'].cat) if not name.startswith("_")]:
print(f"- {name}")
.sparse
s = pd.Series([0, 0, 1, 0, 2], dtype=pd.SparseDtype("int", fill_value=0))
s.sparse.density
# 결과: 0.4
.flags
s = pd.Series([1, 2, 3])
s.flags.allows_duplicate_labels
# 결과: True (기본값)
데이터 타입 | dtype 표기 | 예시 | 설명 |
---|---|---|---|
정수 | int64 , int32 , Int64 등 | 1 , 5 , 100 | 정수형 숫자 |
실수 | float64 , float32 등 | 3.14 , 0.99 | 소수점 포함 숫자 |
복소수(complex) | complex128 , complex64 | 1+2j , 3+4j | 복소수형 숫자 |
문자열 | object , string | 'hello' , '가나다' | 문자열 데이터 |
불리언(Boolean) | bool | True , False | 참/거짓 값 |
날짜/시간 | datetime64[ns] | '2023-01-01' | 날짜 및 시간 데이터 |
timedelta | timedelta64[ns] | '2 days' , '01:00:00' | 시간의 차이 |
카테고리(Category) | category | 'male' , 'female' | 범주형 데이터 |
희소형(Sparse) | Sparse[int64] , Sparse[float] 등 | 대부분 0인 데이터 | 메모리 절약형 데이터 |
s = pd.Series([1, 2, 3])
s.dtype # int64
s = pd.Series([1.1, 2.2, 3.3])
s.dtype # float64
s = pd.Series(['apple', 'banana'])
s.dtype # object 또는 string (명시적 지정 가능)
s = pd.Series(pd.to_datetime(['2023-01-01', '2024-03-23']))
s.dtype # datetime64[ns]
s = pd.Series([True, False, True])
s.dtype # bool
s = pd.Series(['small', 'medium', 'large'], dtype='category')
s.dtype # category
s = pd.Series(pd.to_timedelta(['1 days', '5 hours']))
s.dtype # timedelta64[ns]
s = pd.Series([1+2j, 3+4j])
s.dtype # complex128
s = pd.Series([0, 0, 1, 0, 0], dtype=pd.SparseDtype("int", 0))
s.dtype # Sparse[int64, 0]
pd.to_xxxx
함수들이 함수들은
pd.
형태로 직접 호출됩니다. (DataFrame 객체의 메서드와는 별개입니다.)
함수 | 용도 | 설명과 예시 |
---|---|---|
pd.to_datetime() | 날짜/시간 타입으로 변환 | 문자열 → datetime 변환pd.to_datetime(["2024-03-01", "2024-03-02"]) |
pd.to_timedelta() | 시간 차이로 변환 | 문자열 → timedelta 변환pd.to_timedelta(["2 days", "1 hour"]) |
pd.to_numeric() | 숫자(정수/실수) 타입으로 변환 | 문자열 → 숫자 변환pd.to_numeric(["1.1", "2.2"]) |
pd.to_pickle() | 객체를 pickle 파일로 저장 | 객체를 직렬화하여 저장pd.to_pickle(df, "file.pkl") |
pd.to_datetime
)pd.to_datetime(['2024-03-02', '2024-03-03'])
# DatetimeIndex(['2024-03-02', '2024-03-03'], dtype='datetime64[ns]')
pd.to_timedelta
)pd.to_timedelta(['2 days', '3 hours'])
# TimedeltaIndex(['2 days 00:00:00', '0 days 03:00:00'], dtype='timedelta64[ns]')
pd.to_numeric
)pd.to_numeric(['1.5', '2.6', '3'])
# array([1.5, 2.6, 3. ])
pd.to_pickle
)import pandas as pd
df = pd.DataFrame({'a': [1, 2]})
pd.to_pickle(df, 'df.pkl')