Pandas
- Python Data Analysis
- 데이터 분석 및 조작을 위한 파이썬 라이브러리
- 대용량의 데이터들을 처리하는데 매우 편리
- R에서 사용되던 data frame 구조를 본뜬 DataFrame이라는 구조를 사용
- Pandas 자료구조
- Series: 1차원
- DataFrame: 2차원
- Panel: 3차원
Pandas 라이브러리 불러오기
- pandas는 주로 pd라는 약칭으로 사용된다.
import pandas as pd
Pandas Series
Series 생성
series = pd.Series([1.0, 2.0, 3.0, 4.0, 5.0, 6.0])
series
0 1.0
1 2.0
2 3.0
3 4.0
4 5.0
5 6.0
dtype: float64
- pandas 라이브러리의 Series 메서드로 생성할 수 있다.
- Series 메서드명 앞이 대문자임에 유의하자.
인덱스 및 name 지정
import pandas as pd
series = pd.Series([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], index=['a', 'b', 'c', 'd', 'e', 'f'], name='Example')
series
a 1.0
b 2.0
c 3.0
d 4.0
e 5.0
f 6.0
Name: Example, dtype: float64
- 숫자 인덱스에 문자열 인덱스(별명)를 지정할 수 있다.
- 문자열 인덱스로 지정하더라도 숫자 인덱스를 통한 참조는 여전히 가능하다.
Dictionary → Series
import pandas as pd
# dictionary
data = {
'a' : 1.0,
'b' : 2.0,
'c' : 3.0,
'd' : 4.0,
'e' : 5.0,
'f' : 6.0
}
series = pd.Series(data)
series
a 1.0
b 2.0
c 3.0
d 4.0
e 5.0
f 6.0
dtype: float64
- 딕셔너리 자료형을 이용하여 Series를 생성할 수 있다.
Pandas DataFrame
- DataFrame은 여러 개의 시리즈가 모여 하나의 행렬로 구성된 데이터이다.
- DataFrame은 딕셔너리 등의 자료형이나, 외부의 CSV 파일, Excel 파일을 불러와서 만들 수 있다.
DataFrame 생성
import pandas as pd
df = pd.DataFrame()
- dataframe은 pandas 라이브러리의 DataFrame() 메서드를 사용하여 생성한다.
여러 개의 Series로 DataFrame 생성
import pandas as pd
height_dict = {
'Suzy' : 162.8,
'Minsung' : 180.1,
'Kevin' : 175.0
}
weight_dict = {
'Suzy' : 48.3,
'Minsung' : 75.8,
'Kevin' : 82.1
}
height = pd.Series(height_dict)
weight = pd.Series(weight_dict)
df = pd.DataFrame({
'height' : height,
'weight' : weight
})
print(type(height),'\n',type(weight),'\n',type(df)) # 타입 확인
df # dataframe 출력
<class 'pandas.core.series.Series'>
<class 'pandas.core.series.Series'>
<class 'pandas.core.frame.DataFrame'>
- 2개의 Series를 연결하여 1개의 Dataframe을 생성하였다.
Dictionary → DataFrame 변환
- DataFrame()에 사전 자료형을 매개변수로 넣어 DataFrame으로 변환할 수 있다.
import pandas as pd
# dictionary
data = {
'name': ['Suzy', 'Minsung', 'Kevin', 'Minhyuk', 'Wang', 'Hyunsoo'],
'year':[1998, 2001, 1993, 1999, 1989, 2005],
'height': [162.8, 180.1, 175.0, 172.1, 192.3, 165.2],
'weight': [48.3, 75.8, 82.1, 70.3, 89.3, 63.2]
}
df = pd.DataFrame(data)
df
CSV → DataFrame 변환
- CSV(Comma-Separated Values): 몇 가지 필드를 쉼표(,)로 구분한 텍스트 데이터 및 텍스트 파일
- read_csv() 함수를 이용한다. (excel 파일은 read_excel() 함수를 이용한다.)
- dataframe을 csv 파일로 저장할 때는 to_csv() 함수를 이용한다. (excel 파일은 to_excel() 함수를 이용)
위 csv 파일을 불러와서 DataFrame으로 변환한다.
csv_data = pd.read_csv('C:/jupyter/pandas_data.csv') # dir_name
csv_data
Dictionary를 이용하여 만든 DataFrame과 동일한 DataFrame을 생성하였다.
기초 method
- Pandas에서 사용 가능한 기초 method에 대해 알아보자.
- 모든 method는 앞서 만들었던 위의 Dataframe을 기준으로 수행한다.
Index 설정하기
- set_index를 이용하여 원하는 열(column)을 index로 지정할 수 있다.
df = df.set_index('name')
df
df.head()
- DataFrame의 상위 5개 행의 데이터만 보여줌 (default)
- 괄호 안에 숫자를 넣어 개수를 지정할 수 있음.
df.head()
df.index
- DataFrame의 index를 반환한다.
- 문자열이 index나 column 명에 들어가는 경우 모든 요소는 object 데이터 타입으로 지정된다.
df.index
Index(['Suzy', 'Minsung', 'Kevin', 'Minhyuk', 'Wang', 'Hyunsoo'], dtype='object', name='name')
df.columns
- DataFrame의 column을 구한다.
df.columns
Index(['year', 'height', 'weight'], dtype='object')
df.info()
- DataFrame의 요약을 보여준다.
df.info()
<class 'pandas.core.frame.DataFrame'>
Index: 6 entries, Suzy to Hyunsoo
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 year 6 non-null int64
1 height 6 non-null float64
2 weight 6 non-null float64
dtypes: float64(2), int64(1)
memory usage: 192.0+ bytes
df.describe()
- Column 단위로 DataFrame의 통계를 제공한다.
df.describe()
Data 추출
인덱싱(Indexing)을 이용한 추출
- column 'year'을 indexing하여 row 별 데이터 추출
df['year']
name
Suzy 1998
Minsung 2001
Kevin 1993
Minhyuk 1999
Wang 1989
Hyunsoo 2005
Name: year, dtype: int64
슬라이싱(Slicing)을 이용한 추출(1)
- index value를 기준으로 slicing
- 문자 인덱스를 이용한 슬라이싱은 마지막 인덱스(예제에서는 'Minhyuk')도 포함한다.
df['Suzy':'Minhyuk']
슬라이싱을 이용한 추출(2)
- 숫자 인덱스를 이용하여 추출
- 숫자 인덱스 슬라이싱을 이용할 때는 기존 방식과 동일하게 마지막 인덱스(예제에서는 3)을 제외한다.
df[:3]
column 리스트를 이용한 추출
- 특정 column의 데이터만 추출
df[['height', 'weight']]
loc, iloc 이용한 추출
loc 이용하기
- loc에 index value(문자 인덱스)를 대입하여 데이터 추출
df.loc['Minsung']
year 2001.0
height 180.1
weight 75.8
Name: Minsung, dtype: float64
loc와 슬라이싱 함께 쓰기
df.loc['Minsung':'Wang', :'height'] # 'wang'과 'height'까지도 포함
- loc와 슬라이싱을 함께 사용하여 특정값을 추출할 수 있다.
- 'Minsung'부터 'Wang'까지의 값 중에서 'height' 열까지의 데이터만 추출한다는 의미
- 숫자 인덱스를 사용한 슬라이싱과 다른 점은 마지막 인덱스까지 포함한다는 것이다. (숫자 인덱스를 통한 슬라이싱은 마지막 인덱스-1 임)
iloc 이용하기
- iloc에 특정 위치의 값(숫자 인덱스)을 대입하여 데이터 추출
df.iloc[2]
year 1993.0
height 175.0
weight 82.1
Name: Kevin, dtype: float64
iloc와 슬라이싱 함께 쓰기
df.iloc[0:4, 0:2] # 0~3 인덱스까지의 데이터 중 0~1 열까지의 데이터
- iloc와 숫자 인덱스를 통해서도 데이터 추출이 가능하다.
- loc와 슬라이싱을 사용한 추출 방법과 다르게, iloc와 슬라이싱을 이용한 추출은 기존 방식과 동일하게 마지막 인덱스 -1 까지의 데이터만 추출한다.
추출한 index로 loc 이용하기
- index 추출 후, loc에 대입하여 데이터 추출
df.loc[df.index[0]] # df.index[0] == 'Suzy'
year 1998.0
height 162.8
weight 48.3
Name: Suzy, dtype: float64
column 리스트를 loc에 이용하기
- loc와 column 리스트를 이용하여 특정 column 데이터만 추출하기
df.loc[:, ['height', 'weight']]
Data 추가
행(row) 추가
> 위 DataFrame을 기준으로 행(row) 추가를 수행
pd.concat([dataframe, new_dataframe])
new_dict = {'name': ['Suho'],
'year': [2002],
'height': [187.2],
'weight': [72.5],
}
new_df = pd.DataFrame(new_dict)
df = pd.concat([df, new_df])
df
append 함수 이용
1) dictionary로 추가하기
- df.append(new_dict, ignore_index=True)
new_dict = {'name': 'Suho',
'year': 2002,
'height': 187.2,
'weight': 72.5,
}
df = df.append(new_dict, ignore_index=True)
df
2) dataframe으로 추가하기
- df.append(new_df, ignore_index=True)
df2 = pd.DataFrame({'name': ['Suho', 'Minzy'],\
'year': [2002, 2003],\
'height': [187.2, 165.3],\
'weight': [72.5, 52.5]})
df = df.append(df2, ignore_index=True)
df
df.loc[마지막 인덱스 + 1] = value list
df.loc[df.index[-1] + 1] = ['Suho', 2002, 187.2, 72.5]
df
> 만약 마지막 인덱스 + 1을 넣지 않고, 중간 인덱스 번호를 넣는 경우, Data가 추가되는 것이 아니라 교체된다.
중간에 추가하기 (실제로는 기존 dataframe을 분할하고, 중간에 새로운 data를 넣는 형식)
- concat, iloc를 함께 사용한다.
- pd.concat([df.iloc[:index], new_data, df.iloc[index:]], ignore_index=True)
df2 = pd.DataFrame({'name': ['Suho', 'Minzy'],\
'year': [2002, 2003],\
'height': [187.2, 165.3],\
'weight': [72.5, 52.5]})
df = pd.concat([df.iloc[:2], df2, df.iloc[2:]], ignore_index = True)
df
열(column) 추가
마지막에 열 추가하기
- column명이 없는 경우에는 추가하고자 하는 column 명을 입력하고, value를 같이 지정하면 된다.
- 아직 value가 따로 없을 시, value 대신에 np.nan을 이용하여 NaN 값을 넣도록 하자.
df['country'] = ['korea', 'korea', 'usa', 'korea', 'china', 'korea']
# df['country'] = np.nan 값이 없을 시
중간에 열 추가하기
- df.insert(위치, column 명, value list)로 추가 가능
df.insert(1, 'age', [24, 21, 29, 23, 33, 17])
Data 삭제
> 위 DataFrame을 이용하여 수행
행(row) 삭제
drop() 함수 이용
- df.drop(index, axis=0) # axis는 생략 가능. default가 axis=0.
- df.drop([i, j, k ...]) # 여러 행 동시에 삭제 가능
- drop 함수는 inplace=False가 defualt이므로, inplace=True로 지정하면 dataframe을 새로 만들 필요없이 drop 함수만으로도 기존의 dataframe을 변경시킬 수 있다.
df = df.drop(3, axis=0)
df
df = df.drop([1, 3, 5])
df
슬라이싱 이용
- slicing으로 삭제
- df[1:4]이면 1행부터 3행까지만 추출
df = df[1:4]
df
query 함수 이용
- df.query('column명 != value')
df = df.query('name != "Minsung"')
df
열(column) 삭제
drop 함수 이용
- df.drop(column 명, axis=1)
- df.drop(column 명, axis='columns')
- df.drop([column1, columns2, ...], axis=1)
df = df.drop('year', axis=1)
df
df = df.drop('height', axis='columns')
df
df = df.drop(['year', 'height'], axis=1)
df
Data 수정
> 위 Dataframe을 기준으로 수행
loc 이용하여 수정
특정 행 모든 value 바꾸기
df.loc[0] = ['Hojin', 1995, 175.3, 72.1]
df
- loc를 이용하여 0번 행('Suzy' 인덱스)에 접근하여 값을 변경하였다.
특정 행 일부 value 바꾸기
df.loc[0, 'weight'] = 47.5
df.loc[1, ['year', 'height']] = [2000, 180.5]
df
- loc를 이용하여 특정 행의 인덱스와, 바꾸고자 하는 열 이름을 적으면 된다.
replace 함수를 이용
df = df.replace(2001, 1999) # replace(이전값, 변경값)
df = df.replace(2005, 1999) # df.replace(2005, 1999, inplace=True)
df
- replace를 이용하면 Dataframe의 모든 데이터에 대해 변경이 진행된다.
- replace 메서드의 inplace 매개변수를 True로 두면 Dataframe 대입 과정을 생략할 수 있다.
- 위 코드 동작으로 인해, Minsung과 Hyunsoo의 year 데이터 값이 변경되었다.
apply 함수 이용
def del_point(x): # 소수점 제거
return int(x)
df['height'] = df['height'].apply(del_point) # 기존 함수 이용
df['weight'] = df['weight'].apply(lambda x: int(x)) # lambda 식 이용
df
- apply 함수를 이용하여 특정 열에 값을 변경하는 함수를 적용할 수 있다.
- 함수를 apply에 매개변수로 넘기는 경우에는 () 소괄호를 적지 않아야 함에 유의하자.
Masking 연산
- numpy에서 사용하는 masking 연산을 pandas에서도 동일하게 사용할 수 있다.
- 마스킹 연산이 무엇인지 모르겠다면 numpy 게시글 참고
Masking 사용하여 데이터 추출하기
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(3, 3), columns=['A', 'B', 'C'])
df
- Masking을 위해 새로운 Dataframe을 생성하였다.
Mask 생성하기
df["A"] > 0.3, df["B"] < 0.5, df["C"] < 0.2
(0 False
1 True
2 True
Name: A, dtype: bool,
0 True
1 True
2 True
Name: B, dtype: bool,
0 False
1 True
2 True
Name: C, dtype: bool)
- 비교 연산자를 이용하여 bool 형식의 Mask를 생성할 수 있다.
- bool 형식의 mask를 이용할 때 데이터는 True 일 때만 출력된다.
- 위 Mask를 이용하여 모든 조건에 대해 True인 데이터만 추출하도록 해보자.
Mask 이용하여 데이터 추출
df[(df["A"] > 0.3) & (df["B"] < 0.5) & (df["C"] < 0.2)] # &는 and를 의미
- 모든 조건에 대하여 True인 행은 1번, 2번 인덱스 행이므로 Masking에 의해 해당 행들만 추출되었다.
query 함수 이용하기
df.query("A > 0.3 and B < 0.5 and C < 0.2")
- query 함수에 조건식을 작성하여 데이터를 추출할 수 있다.
- 보통 query보다는 더욱 직관적으로 조건을 이해할 수 있는 masking 방식을 이용하는 편이다.
누락 데이터 수정
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(3, 3), columns=['A', 'B', 'C'])
for i, col in enumerate(['A', 'B', 'C']):
df.loc[i, col] = np.nan
df
- NaN 값이 존재하는 Dataframe을 생성하였다.
isnull() / notnull()
isnull()
df.isnull()
- isnull() 함수는 누락 데이터에 대해 True를 반환하며, bool 형식의 mask를 얻을 수 있다.
notnull()
df.notnull()
- notnull() 함수는 누락되지 않은 데이터에 대해서 True를 반환한다.
Masking으로 누락 데이터 수정하기
df[df.isnull()] = 0
df
- Dataframe에 masking을 적용하면, True인 값(누락값)에 대해서 0을 대입하는 코드가 수행된다.
fillna()
df = df.fillna(0) # df.fillna(0, inplace=True)
df
- fillna()라고 누락 값에 특정 값을 채워주는 함수가 존재한다. 이것을 사용하는 편이 더 간단하다.
dropna()
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(3, 3), columns=['A', 'B', 'C'])
df.loc[0] = np.nan
df
- dropna()는 누락값이 포함된 행/열을 제거하는 함수이다. (axis=0는 행, axis=1는 열, default는 행 기준)
- (정확히는 누락값이 제외된 행/열을 반환하는 함수로, 대입 과정 혹은 inplace=True가 필요)
df = df.dropna() # df.dropna(inplace=True)
df
Dataframe 정렬
import pandas as pd
data = [[40, 50, 30], [10, 80, 60], [70, 20, 90]]
df = pd.DataFrame(data, columns=['A', 'B', 'C'])
df
- Dataframe 정렬을 수행하기 위해 3x3 데이터프레임을 생성하였다.
sort_values()
- sort_values()는 데이터프레임을 값(Value)을 기준으로 정렬하는 메서드이다.
- Default 기본 정렬 기준은 행(row)과 오름차순(ascending)이다. (ascending 파라미터의 디폴트값은 True)
- 행이 바뀌는 정렬 ▶ 행 기준 정렬 (axis=0)
- 열이 바뀌는 정렬 ▶ 열 기준 정렬 (axis=1)
df.sort_values('정렬 기준')
df.sort_values('정렬 기준', inplace=True) # inplace 파라미터를 True하면 원 DF의 값이 변함
df.sort_values('정렬 기준', ascending=False) # ascending 파라미터를 False하면 내림차순 정렬
행(row) 기준 정렬
# Column 'A'의 행 기준 (오름차순)
df.sort_values('A')
- 열 'A'에 해당하는 행의 값을 기준으로 정렬을 진행하였다.
- Default 설정에 따라 오름차순으로 정렬이 진행되었음을 알 수 있다.
- 나머지 열 'B'와 'C'의 행은 열 'A'의 정렬 기준에 따라 배치된다.
# Column 'A'의 행 기준 (내림차순)
df.sort_values('A', ascending=False)
- ascending=False로 지정하면 내림차순의 정렬을 수행할 수 있다.
# 여러 Column의 행을 기준으로 정렬
df.sort_values(['C', 'A'])
- sort_values() 메서드에 Column 리스트를 인자로 넘기면, 여러 Column의 행을 기준으로 정렬을 수행할 수 있다.
- Column 리스트의 정렬 순서는 뒤에서부터 앞이다. (위 코드에서는 'A' → 'C' 순서)
열(column) 기준 정렬
df.sort_values(1, axis=1, ascending=False)
- 1번 인덱스 행의 값을 내림차순으로 정렬하였다.
- 1은 1번 인덱스를, axis=1은 열기준 정렬, ascending=False는 내림차순 정렬을 의미한다.
sort_index()
- sort_index()는 데이터프레임을 인덱스(index) 번호를 기준으로 정렬하는 메서드이다. (데이터 값이 아님)
- Default 기본 정렬 기준은 오름차순(ascending)이다. (ascending 파라미터의 디폴트값은 True)
df.sort_index() # 오름차순 정렬
df.sort_index(ascending=False) # 내림차순 정렬
인덱스 정렬
df.sort_index(ascending=False)
- sort_index() 메서드를 이용하여, 인덱스를 내림차순으로 정렬하였다.
그룹화 하기
- Dataframe을 특정 기준으로 집계하기 위해 그룹화를 진행할 수 있다.
import pandas as pd
# dictionary
data = {
'name': ['Suzy', 'Minsung', 'Kevin', 'Minhyuk', 'Wang', 'Hyunsoo'],
'year':[1998, 2001, 1993, 1999, 1989, 2005],
'height': [162.8, 180.1, 175.0, 172.1, 192.3, 165.2],
'weight': [48.3, 75.8, 82.1, 70.3, 89.3, 63.2],
'country': ['Korea', 'Korea', 'USA', 'USA', 'China', 'Korea']
}
df = pd.DataFrame(data)
df
- 실습을 위해 이전에 쓰던 데이터에 'country' 열을 추가하였다.
groupby()
- groupby()는 특정 Column을 index로 사용하여 Dataframe을 집계하고 싶을 때 사용하는 메서드이다.
- groupby()의 반환값은 온전한 Dataframe이 아니며, 반드시 집계함수가 동반되어야 한다.
- groupby()로 Dataframe을 집계할 때 1개 이상의 Column을 index로 사용할 수 있다.
groupby()의 반환값
df.groupby('country')
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x000002258119A250>
- 집계함수를 사용하지 않은 groupby()의 반환값은 위와 같으며, 반드시 sum(), mean() 등의 함수를 이용하여 데이터를 정리하여야만 온전한 Dataframe이 반환된다.
groupby()와 집계함수를 함께 사용
df.groupby('country').mean() # country마다 평균낸 데이터를 집계하도록
- 'country' 열을 index로 하여 데이터들의 평균(mean)을 집계하도록 코드를 작성하였다.
- 이처럼 groupby()에 index로 설정할 열(column)을 인자로 넘기고 나서, 꼭 집계할 기준함수를 명시해야 한다.
더보기
apply() 메서드 사용
- apply() 메서드에 함수를 파라미터로 넘겨서 데이터를 집계할 수 있다.
- 하지만 함수 구현이 기존 집계함수를 사용하는 것보다 까다롭기 때문에 기존 집계함수를 사용하는 것을 추천.
- 함수 구현 시 고려해야 할 사항이 많음
aggregate()
df.groupby('country').aggregate([min, 'mean', max])
- aggregate() 메서드는 여러 개의 집계를 한 번에 계산할 수 있도록 한다.
- aggregate() 파라미터의 따옴표 기준
- 만약 파이썬 기본 집계함수라면 위 코드의 min과 max 처럼 따옴표를 사용하지 않아도 됨.
- 파이썬 기본 집계함수가 아니라면, aggregate에서 지원되는 함수 내에서 따옴표를 통해 사용할 수 있음.
Dictionary 넘기기
df.groupby('country').aggregate({'year':'mean', 'height':max, 'weight':min})
- Dictionary 자료형을 파라미터로 넘기면, 각 Column마다 집계함수를 직접 지정할 수 있다.
filter()
- groupby를 통해 집계한 데이터로부터 Mask를 생성하여 데이터 필터링을 진행할 수 있다.
Filter 함수 생성
def Filter(x):
return x['height'].mean() > 170
- 'height' 열에 대한 평균이 170이 넘는 경우에만 True를 반환하도록 하는 함수를 생성하였다.
- 이 함수는 filter() 메서드의 파라미터로 넘겨질 예정이다.
mean() 데이터 확인
df.groupby('country').mean()
- 'country'를 기준으로 groupby하고, mean() 함수를 통해 평균을 낸 데이터이다.
- 데이터를 보면 China와 USA의 'height' 평균만 170이 넘어감을 알 수 있다.
- 데이터 필터링을 진행하면 China와 USA의 행들만 필터링되어 출력될 것이라고 예상할 수 있다.
데이터 필터링
df.groupby('country').filter(Filter)
- 예상대로 국적이 USA, China인 데이터들만 출력되어 나왔다.
get_group()
df.groupby('country').get_group('Korea')
- get_group() 메서드를 통해 groupby를 진행한 데이터에서 특정 key값의 데이터를 추출할 수 있다.
Multi Index
- Dataframe에 다중 index를 설정하여, 여러 계층을 갖는 고차원 데이터를 생성할 수 있다.
Multi index 생성 (메서드 X)
메서드 없이 만들기 (행)
import pandas as pd
data = [[40, 50, 30],
[10, 80, 60],
[70, 20, 90],
[80, 70, 30],
[10, 30, 50],
[80, 50, 40]
]
df = pd.DataFrame(data,
index=[['A', 'A', 'B', 'B', 'C', 'C'], [1, 2, 1, 2, 1, 2]],
columns=['Data1', 'Data2', 'Data3']
)
df
- 행 인덱스를 다중으로 설정하여 계층 구조를 형성하였다.
메서드 없이 만들기 (열)
import pandas as pd
data = [[40, 50, 30, 10, 80, 60],
[70, 20, 90, 80, 70, 30],
[10, 30, 50, 80, 50, 40]
]
df = pd.DataFrame(data,
index=[['A', 'B', 'C']],
columns=[['Data1', 'Data1', 'Data2', 'Data2', 'Data3', 'Data3'],\
[1, 2, 1, 2, 1, 2]]
)
df
- 열 인덱스도 다중 설정이 가능하다.
Multi index 생성 (메서드 O)
pd.MultiIndex.from_arrays(arrays, sortorder=None, names=_NoDefault.no_default)
pd.MultiIndex.from_product(iterables, sortorder=None, names=_NoDefault.no_default)
pd.MultiIndex.from_tuples(tuples, sortorder=None, names=None)
pd.MultiIndex.from_frame(df, sortorder=None, names=None)
pd.Index(data=None, dtype=None, copy=False, name=None, tupleize_cols=True)
- pandas의 MultiIndex() 라는 메서드를 이용하여 멀티인덱스를 만들 수 있다.
- 인자로 넘기는 자료형에 따라 멀티인덱스로 변환할 수 있다.
- 함수의 파라미터에 대한 내용은 위 사이트를 참고하자.
메서드 사용하여 멀티인덱스 만들기 (행)
import pandas as pd
data = [[40, 50, 30],
[10, 80, 60],
[70, 20, 90],
[80, 70, 30],
[10, 30, 50],
[80, 50, 40]
]
index_arrays = [['A', 'A', 'B', 'B', 'C', 'C'],
[1, 2, 1, 2, 1, 2]
]
index = pd.MultiIndex.from_arrays(index_arrays) # 인덱스 설정
df = pd.DataFrame(data, columns=['Data1', 'Data2', 'Data3'], index = index)
df
메서드 사용하여 멀티인덱스 만들기 (열)
import pandas as pd
data = [[40, 50, 30, 10, 80, 60],
[70, 20, 90, 80, 70, 30],
[10, 30, 50, 80, 50, 40]
]
column_arrays = [['Data1', 'Data1', 'Data2', 'Data2', 'Data3', 'Data3'],\
[1, 2, 1, 2, 1, 2]
]
columns = pd.MultiIndex.from_arrays(column_arrays) # 인덱스 설정
df = pd.DataFrame(data, columns=column_arrays, index = ['A', 'B', 'C'])
df
Multi Index 데이터 조회
- 기존 인덱싱 방식 혹은 loc, iloc를 이용하여 조회가 가능하다.
기존 indexing 방식
print(df['Data1'])
print('---------------')
print(df['Data2'][1])
A 1 40
2 10
B 1 70
2 80
C 1 10
2 80
Name: Data1, dtype: int64
---------------
80
loc, iloc 이용
print(df.loc['A'])
print('---------------')
print(df.iloc[2][1]) # ['B']['Data2']
Data1 Data2 Data3
1 40 50 30
2 10 80 60
---------------
20
Pivot Table
- Pandas에서는 엑셀에서 주로 사용되는 Pivot Table 기능을 구현할 수 있는 함수인 pivot_table()을 제공한다.
Pivot Table 문법
pandas.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean',
fill_value=None, margins=False, dropna=True, margins_name='All',
observed=False, sort=True)
- data: Dataframe
- values: 분석에 사용할 열
- index: 피벗테이블의 행 인덱스로 들어갈 'Key' (그룹화할 칼럼명)
- columns: 피벗테이블의 열 인덱스로 사용될 'Key' (분석되는 values 데이터를 좀 더 세분화하는 역할)
- aggfunc: 피벗테이블을 형성할 때 데이터에 적용되는 집계함수
- fill_value: 누락값이 존재할 시 이를 대체할 값
- margins:오른쪽 끝과 아래 끝에 데이터의 총합산을 나타내고 싶을 때 사용
- dropna: 모든 항목이 Nan인 열을 제외할 때 사용 (default=True)
- margins_name: margins의 이름을 정하는 파라미터 (default 명 = All)
- observed: 범주형으로 그룹화된 데이터에서 적용하는 파라미터
- sort: 데이터를 정렬할지 말지 결정하는 파라미터
Pivot Table 만들기
사용할 데이터 프레임
import pandas as pd
# dictionary
data = {
'name': ['Suzy', 'Minsung', 'Kevin', 'MinJi', 'Wang', 'Hyunsoo'],
'sex' : ['Female', 'Male', 'Male', 'Female', 'Male', 'Male'],
'year':[1998, 2001, 1993, 1999, 1989, 2005],
'height': [162.8, 180.1, 175.0, 172.1, 192.3, 165.2],
'weight': [48.3, 75.8, 82.1, 68.3, 89.3, 63.2],
'country': ['Korea', 'Korea', 'USA', 'USA', 'China', 'Korea']
}
df = pd.DataFrame(data)
df
성별 및 국적에 따른 키/몸무게 평균 정리
df.pivot_table(
values = ['height', 'weight'],
index = 'sex',
columns = 'country',
aggfunc = np.mean,
fill_value = 'X'
)
- 성별과 국적에 따라 키/몸무게 평균을 정리하였다.
- China 국적의 여성 값이 없기에 해당 평균은 Nan값이며, fill_value로 인해 Nan값이 'X'로 치환되었다.