본문 바로가기
DS/데이터-PANDAS

PANDAS ST2 인덱싱(특정 행/열 선택, 추출, 라벨추출, 값만 추출)

by 시에라177 2022. 5. 23.

#판다스의 인덱싱

판다스에서 인덱싱할 때는 loc나 iloc를 많이 사용. loc,iloc를 사용하는 이유는 2차원 인덱싱을 함에 있어 편리하기 때문이다. 일반적으로 라벨(df['a']), 라벨리스트(df['a','b']), 정수인덱스(df[0])를 사용해서 2차원 인덱싱을 하긴 어렵다. 틀린 것은 아니지만 loc와 iloc를 사용하길 권장.

 

#Series 객체의 인덱싱

-시리즈는 딕셔너리와 상당히 유사하다. 그렇기에 key() 메소드를 사용해도 인덱스 추출 가능하다. 

s = pd.Series([0, 0.3, 0.6, 0.9, 1.2], index = ['a', 'b', 'c', 'd', 'e'])

print(s['d'])
>>>
0.9

'b' in s
>>>
True

# keys()로 인덱스 추출가능
print(s.keys())
>>>
Index(['a', 'b', 'c', 'd', 'e', 'f'], dtype='object')

#s.items() 자체는 zip으로 묶여 나오기 때문에 list()로 변환해주어야한다.
list(s.items())
>>>
[('a', 0.0), ('b', 0.3), ('c', 0.6), ('d', 0.9), ('e', 1.2)]

#추가
s['f'] = 1.5
s
>>>
a    0.0
b    0.3
c    0.6
d    0.9
e    1.2
f    1.5


인덱스 라벨로 슬라이싱
print(s['b' : 'e'])

range정수로 슬라이싱
print(s[1:5])
>>>
b    0.3
c    0.6
d    0.9
e    1.2

b    0.3
c    0.6
d    0.9
e    1.2

#불리언 인덱싱
s[(s > 0.5) & (s < 1.0)]
>>>
c    0.6
d    0.9

 

#정수인덱싱

-.iloc[]

정수값)으로 인덱싱과 슬라이싱할 수 있다. i의 뜻이 integer.

s = pd.Series(['a', 'b', 'c', 'd', 'e'], index = [2, 4, 6, 8, 9])
s
>>>
2    a
4    b
6    c
8    d
9    e

s[2]
>>>
'a'

#슬라이싱은 디폴트 인덱스(정수range)로 된다.
s[2:4]
>>>
6    c
8    d

# .iloc[] 으로는 정수값으로 인덱싱함. 디폴트 인덱스로 인덱싱한다고 보면 됨.
s.iloc[1]
>>>
'b'

s.iloc[2:4]
>>>
6    c
8    d

-reindex()

인덱스 새로 설정.

만약 값이 비어있다면 전 값으로 채울 수도 있음. method = 인자로 결측데이터 처리할 수 있음.

s.reindex(range(10)) #굳이 range만을 쓸 필요는 없다. 문자 리스트를 넣어도 되고 자유롭다
>>>
0    NaN
1    NaN
2      a
3    NaN
4      b
5    NaN
6      c
7    NaN
8      d
9      e

#method사용 비어 있으면 이전 값으로 채움.
s.reindex(range(10), method = 'bfill')
>>>
0    a
1    a
2    a
3    b
4    b
5    c
6    c
7    d
8    d
9    e

#DataFrame의 인덱싱

#열라벨 추출

-딕셔너리로 데이터프레임을 만들면 키값은 처음에 열이 되기 때문에 keys()와 .columns는 같다.

#딕셔너리로 데이터 프레임을 만들면 키값은 처음에 열이 되기 때문에
#keys()로 추출하면 열 라벨을 추출할 수 있다.

print(pp_k.keys())
print(pp_k.columns)
>>>
Index(['인구수', '남성', '여성'], dtype='object')
Index(['인구수', '남성', '여성'], dtype='object')

print(pp_k.index)
>>>
Index(['서울_특별시', '부산_광역시', '대구_광역시', '인천_광역시'], dtype='object')

 

#df['x']

형식으로는 열로 값들로 인덱싱, 슬라이싱 할 수 있다. 그러나 loc와 iloc 사용 권장.

df.x으로도 사용가능하다. 

pp_k['남성']
>>>
서울_특별시    40000000
부산_광역시    20000000
대구_광역시    15000000
인천_광역시    15000000
Name: 남성, dtype: int64

#굳이 대괄호안에 열 이름을 넣어 접근 하지 않아도 됨.
pp_k.남성
>>>
서울_특별시    40000000
부산_광역시    20000000
대구_광역시    15000000
인천_광역시    15000000
Name: 남성, dtype: int64

#열 추가

#추가 
pp_k['남녀비율'] = pp_k.남성 / pp_k.여성 * 100

>>>
	인구수	남성	여성	남녀비율
서울_특별시	80000000	40000000	40000000	100.000000
부산_광역시	35000000	20000000	15000000	133.333333
대구_광역시	25000000	15000000	10000000	150.000000
인천_광역시	25000000	15000000	10000000	150.000000

#df.values : 값들만 추출

#df.values[n] : n행의 값들만 추출

pp_k.values
>>>
array([[8.00000000e+07, 4.00000000e+07, 4.00000000e+07, 1.00000000e+02],
       [3.50000000e+07, 2.00000000e+07, 1.50000000e+07, 1.33333333e+02],
       [2.50000000e+07, 1.50000000e+07, 1.00000000e+07, 1.50000000e+02],
       [2.50000000e+07, 1.50000000e+07, 1.00000000e+07, 1.50000000e+02]])

pp_k.values[1]
>>>
array([3.50000000e+07, 2.00000000e+07, 1.50000000e+07, 1.33333333e+02])

#df.T : 전치하기

#전치 행과 열을 뒤집음. (numpy에도 있음)
pp_k.T

>>>
	서울_특별시	부산_광역시	대구_광역시	인천_광역시
인구수	80000000.0	3.500000e+07	25000000.0	25000000.0
남성	40000000.0	2.000000e+07	15000000.0	15000000.0
여성	40000000.0	1.500000e+07	10000000.0	10000000.0
남녀비율	100.0	1.333333e+02	150.0	150.0

 

 

#loc

행과 열의 라벨로 인덱싱하거나, 불리언 배열로 인덱싱할 수 있게 해줌.

행만 넣을 수도, 열만 넣을 수도 있다. 열만 넣을 때 형태 주의

loc는 location의 약자

pp_k.loc[ :'인천_광역시', :'남성']
>>>
	인구수	남성
서울_특별시	80000000	40000000
부산_광역시	35000000	20000000
대구_광역시	25000000	15000000
인천_광역시	25000000	15000000

이산되어 있는 특정 행과 열을 선택하려면 []로 한번더 감싼다.

# 이산되어 있는 여러 행과 열을 선택하려면, []로 한번더 깜싼다.
pp_k.loc[['서울_특별시', '대구_광역시']]
pp_k.loc[:,['인구수', '여성']]

>>>
	인구수	남성	여성	남녀비율
서울_특별시	80000000	40000000	40000000	100.0
대구_광역시	25000000	15000000	10000000	150.0

pp_k.loc[['서울_특별시', '대구_광역시'],['인구수', '여성']]
>>>
	인구수	여성
서울_특별시	80000000	40000000
대구_광역시	25000000	10000000

불리언으로 인덱싱(넘파이의 논리인덱싱)

#loc에는 조건도 넣을 수 있다.
pp_k.loc[pp_k.여성 >= 15000000]

>>>
	인구수	남성	여성	남녀비율
서울_특별시	80000000	40000000	40000000	100.000000
부산_광역시	35000000	20000000	15000000	133.333333

#iloc

정수인덱싱

#iloc
pp_k.iloc[2:4]
>>>
	인구수	남성	여성	남녀비율
대구_광역시	25000000	15000000	10000000	150.0
인천_광역시	25000000	15000000	10000000	150.0

pp_k.iloc[2:4, 1:3]
>>>
	남성	여성
대구_광역시	15000000	10000000
인천_광역시	15000000	10000000