[Python.Pandas] DataFrame Series 추출, loc/iloc 이해하기
2020. 12. 16. 05:00ㆍPython과 머신러닝/Pandas 데이터 분석
0. 이전 포스트
- 2020/12/15 - [Python과 머신러닝/Pandas 데이터 분석] - [Python.Pandas] Pandas 기본 - DataFrame, Series, Index의 이해
1. Dict Data를 Pandas로 변환하기
In [1]:from pandas import Series, DataFrame
import pandas as pd
import numpy as np
In [2]:raw_data = {'first_name': ['Jason', 'Molly', 'Tina', 'Jake', 'Amy'],
'last_name' : ['Miller', 'Jacobson', 'Ali', 'Milner', 'Cooze'],
'age' : [42, 52, 36, 24, 73],
'city': ['San Francisco', 'Baltimore', 'Miami', 'Douglas', 'Boston']}
raw_data
Out[2]:{'first_name': ['Jason', 'Molly', 'Tina', 'Jake', 'Amy'],
'last_name': ['Miller', 'Jacobson', 'Ali', 'Milner', 'Cooze'],
'age': [42, 52, 36, 24, 73],
'city': ['San Francisco', 'Baltimore', 'Miami', 'Douglas', 'Boston']}
In [3]:df = pd.DataFrame(raw_data,
columns = ['first_name', 'last_name', 'age', 'city'],
index=[1,2,3,4,5])
df
Out[3]: first_name last_name age city
1 Jason Miller 42 San Francisco
2 Molly Jacobson 52 Baltimore
3 Tina Ali 36 Miami
4 Jake Milner 24 Douglas
5 Amy Cooze 73 Boston
- dict type으로 원하는 데이터를 생성한 뒤에
- pd.DataFrame을 통해 DataFrame 객체를 생성할 수 있다.
- 이때 columns를 지정해줄 수 있고, index도 지정할 수 있다.
2. Series 데이터 추출하기
In [4]:df['first_name'] #series 뽑기
Out[4]:1 Jason
2 Molly
3 Tina
4 Jake
5 Amy
Name: first_name, dtype: object
In [5]:df.loc[:, 'last_name'] # series로 추출
Out[5]:1 Miller
2 Jacobson
3 Ali
4 Milner
5 Cooze
Name: last_name, dtype: object
In [6]:df.loc[:, ['last_name']] # dataframe으로 추출
Out[6]:
last_name
1 Miller
2 Jacobson
3 Ali
4 Milner
5 Cooze
- 하나의 DataFrame에서 원하는 Series를 추출하기 위해서는 index의 이름으로 접근하면 된다.
- 새로운 Series(Column)을 추가하고 싶다면 df[새로운 index 명]으로 추가할 수 있다.
- 이를 df.loc[:, 'last_name']과 같은 식으로 표현할 수도 있다.
- 위 데이터를 dataframe 형태로 추출하고 싶다면 column 명에 []를 추가해서
df.loc[:, ['last_name']]이라고 하면 된다.
3. DataFrame에 Series 추가/제거하기
In [5]:df['elderly'] = df.age > 50
df
Out[5]:
first_name last_name age city elderly
1 Jason Miller 42 San Francisco False
2 Molly Jacobson 52 Baltimore True
3 Tina Ali 36 Miami False
4 Jake Milner 24 Douglas False
5 Amy Cooze 73 Boston True
In [6]:df.drop('elderly', axis=1)
Out[6]:
first_name last_name age city
1 Jason Miller 42 San Francisco
2 Molly Jacobson 52 Baltimore
3 Tina Ali 36 Miami
4 Jake Milner 24 Douglas
5 Amy Cooze 73 Boston
- df['elderly'] = df.age > 50은 df의 age가 50보다 큰 경우 True, 아닌 경우 False를 넣어서 새로운 Column을 추가하는 것이다.
- df.drop('elderly', axis=1)을 통해서 column 중 elderly를 제거해달라는 동작을 수행할 수 있다.
4. df.loc과 df.iloc의 지옥 - 기본
In [6]:df.loc[1]
Out[6]:first_name Jason
last_name Miller
age 42
city San Francisco
Name: 1, dtype: object
In [7]:df.iloc[1]
Out[7]:first_name Molly
last_name Jacobson
age 52
city Baltimore
Name: 2, dtype: object
- df.loc은 'index명으로 row의 정보를 추출'할 때 사용되는 명령어입니다.
- 그렇기 때문에 df의 1 이라는 이름을 가진 데이터를 찾아서 Jason Miller 씨의 데이터를 추출한다.
- df.iloc은 'index 번호로 row의 정보를 추출'할 때 사용되는 명령어입니다.
- 즉, dataframe의 index명은 난 모르겠고, 원래 C에서 접근하던대로 index번호로 접근하고 싶을 때 무작정 쓸 수 있는 것이 .iloc입니다.
- 그렇기 때문에 df.iloc[1]은 index명은 전혀 상관하지 않고 0-base index의 1번째 (즉 2번째) 데이터를 추출하여 전달합니다.
5. df.loc과 df.iloc의 지옥 - 심화
In [8]:s = pd.Series(np.nan,
index=[49,48,47,46,45,1,2,3,4,5])
s
Out[8]:49 NaN
48 NaN
47 NaN
46 NaN
45 NaN
1 NaN
2 NaN
3 NaN
4 NaN
5 NaN
dtype: float64
In [9]:s.loc[:3]
Out[9]:49 NaN
48 NaN
47 NaN
46 NaN
45 NaN
1 NaN
2 NaN
3 NaN
dtype: float64
In [10]:s.iloc[:3]
Out[10]:49 NaN
48 NaN
47 NaN
dtype: float64
- 예시를 위해서 49~5까지 이상한 순서를 가진 index의 series를 생성한다.
- In[9]와 같이 s.loc[:3]이라 하면 '3이라는 index명을 가진 row까지 전부 출력하라'는 의미가 되기 때문에,
실제 index 값과는 무관하게 49~3까지 전부 출력한다 - In[10]과 같이 s.iloc[:3]이라 하면 '3번째 index까지 row 정보를 출력하라'는 의미가 되기 때문에
49~47까지의 값들만 출력한다. - loc과 iloc은 직접 써보기 전까지는 항상 헷갈리지만, 한번 사용해보면 생각보다 간단한 개념이다.
6. 관련 포스트
- 2020/12/17 - [Python과 머신러닝/Pandas 데이터 분석] - [Python.Pandas] DataFrame / Series 간 Operation 이해
- 2020/12/18 - [Python과 머신러닝/Pandas 데이터 분석] - [Python.Pandas] Selection과 Drop
'Python과 머신러닝 > Pandas 데이터 분석' 카테고리의 다른 글
[Python.Pandas] Map 함수 실전편 + .replace함수 사용하기 (0) | 2020.12.20 |
---|---|
[Python.Pandas] Lambda함수와 Map함수 이해하기 - Series.map (0) | 2020.12.19 |
[Python.Pandas] Selection과 Drop (0) | 2020.12.18 |
[Python.Pandas] DataFrame / Series 간 Operation 이해 (0) | 2020.12.17 |
[Python.Pandas] Pandas 기본 - DataFrame, Series, Index의 이해 (0) | 2020.12.15 |