pandas의 “rowwise” filter : loc vs iloc
loc
get
- df.loc[[“index명”]]
- df.loc[ condition, “col명”]
set
- df.loc[0] = [val1, val2]
- df.loc[len(df)] = {‘col1’: ‘val1’, ‘col2’: ‘val2’}
연산 기준
- Serise는 index기준
- Dataframe는 columns 기준
조회방법
- 컬럼명 df[ [“col1”, “col2”] ]
- loc, iloc loc[ rowindex, ]
loc[ rowindex, [“col1”, “col2”]]
iloc[ 0:3, 1:6 ] - indexing활용
예제 df
df = pd.DataFrame([ [ 1, 2, 3, 4, 5], [ 6, 7, 8, 9, 10], [11, 12, 13, 14, 15], [16, 17, 18, 19, 20] ], index = ['ridx1', 'ridx2', 'ridx3', 'ridx4'], columns=['colNm1', 'colNm2', 'colNm3', 'colNm4', 'colNm5'])
dataFrame에 대한 행 / 열/ filtering
행
loc
df.loc[['ridx1']] # DataFrame df.loc[['ridx1'],] df.loc[['ridx1'],:] df.loc[['ridx1', 'ridx2']] df.loc[['ridx1','ridx2'], ] df.loc[['ridx1', 'ridx2'], :] #same above
iloc
df.iloc[[0]] # DataFrame df.iloc[[0,1]] df.iloc[[0,1], :]
[ ] 특이한 케이스
df[0:2] #0부터 시작하는 숫자 .. df.iloc[[0,1,2]] ≈ df[0,1] ERROR
loc : index이름
iloc : index가 아닌 번호
0 1 2 3 4
0
1
2
3
행열 DataFrame
loc
df.loc[['ridx2', 'ridx3'], ['colNm3', 'colNm4']]
iloc
df.iloc[[1,2], [2,3]]
열
df[[‘col1’, ‘col2’]]
df.filter(regex=””)
loc
df.loc[: , ['colNm1', 'colNm2']]
iloc
df.iloc[:, [0,1]]
[ ] 특이한 케이스.
df[ 'colNm1'] 의 확장 (Series의 확장) df[['colNm1', 'colNm2']] df.filter(items=['colNm1','colNm2']) df.filter(like='colNm', axis=1)
오류
df['colNm1', 'colNm2'] # X 문법틀림 df.loc['ridx1', 'ridx2'] # 2개이상은 []로 묶지 않으면 오류
Difference between iloc and loc
loc (location) | iloc (integer location) | |
이름 | location, 레이블인덱싱 | integer location 포지션인덱싱 |
추출기준 | 행또는열의 label이나 boolean array로 (사람이 읽을수 있는 라벨값, 특정조건식 으로) | 행또는열의 순서를 나타내는 정수로 ( 컴퓨터가 읽기좋은 숫자, 위치순서로) |
df.loc[행인덱싱값, 열인덱싱값] | df.iloc[행인덱스, 열인덱스] | |
부울 인덱싱 | 사용가능 | 불가능 |
값하나 | 행하나 (df.loc[0] 인덱스이름이 0인행만) | |
범위의 두 끝점을 모두 포함 | Python 슬라이싱 규칙을 사용 |
Series (cf. dataFrame)에 대한 filtering
행 Series (cf. dataFrame)
pandas.core.frame.DataFrame 이 아닌 pandas.core.series.Series
loc 라벨
df.loc['ridx1'] # pandas.core.series.Series
iloc 순서정수
df.iloc[0] # pandas.core.series.Series
colNm1 1
colNm2 2
colNm3 3
colNm4 4
colNm5 5
Name: ridx1, dtype: int64
열 Series
loc 라벨
df.loc[:, 'colNm1'] df.loc[:, ['colNm1']] => dataframe
iloc 순서정수
df.iloc[:, 0] df['colNm1'] df.colNm1 # same above
ridx1 1
ridx2 6
ridx3 11
ridx4 16
Name: colNm1, dtype: int64
오류
df['ridx1'] # X .loc없이 row라벨은 안됨 df['ridx1', 'ridx2'] # X df[['ridx1']] # X df[['ridx1', 'ridx2']] # X
loc 검색
df.loc[['ridx3', 'ridx4'], ['colNm1', 'colNm2', 'colNm3', 'colNm4', 'colNm5']] df.loc[df['colNm1']>6] df.loc[[False, False, True, True]] df.loc[[False, False, True, True], :] df.iloc[[False, False, True, True]] df.iloc[[False, False, True, True], :] df.loc[df['colNm1'].isin([11,16])] df.loc[ df['colNm1'].isin([11,16]), : ] df.loc[(df['colNm1'].isin([6,11,16])) & (df['colNm4']>10)]