--03.DataFrame.ipynb--
import numpy as np
import pandas as pd
import os
base_path ='/content/drive/MyDrive/dataset'
filepath = os.path.join(base_path, 'titanic.csv')
df = None
def load_titanic() :
return pd.read_csv(filepath) # CSV 파일로 부터 -> DataFrame 으로 읽어오기.
df = load_titanic()
df
df.head()
df.tail()
df.shape
df.describe()
df.info()
df
df.index
df.index.values
df.columns
df.values # row 데이터들의 2차원 array
df = pd.DataFrame([1, 2, 3])
df
pd.DataFrame([
'dog',
'cat',
'bird',
])
df = pd.DataFrame([
[1, 2, 3],
[4, 5, 6],
])
df
len(df)
df.shape
df.ndim
df.size
df2 = pd.DataFrame([
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
], columns=['a', 'b', 'c', 'd'])
df2
df2.columns
df2.columns = ['국어', '영어', '수학', '과학']
df2
df2.index
df2.index = ['이유진', '이지민', '용호중']
df2
data = {'a':100, 'b':200, 'c':300}
pd.DataFrame(data, index = ['x'])
pd.DataFrame(data, index = ['x', 'y', 'z'])
data = {'a':[100], 'b':[200], 'c':[300]}
pd.DataFrame(data)
data = {'a' : [100, 200, 300], 'b': ['cat', 'dog', 'bird'], 'c': [40, 50, 60]}
pd.DataFrame(data)
a = pd.Series([100, 200, 300], ['a', 'b', 'c'])
b = pd.Series([101, 202, 303], ['a', 'b', 'c'])
c = pd.Series([110, 220, 330], ['a', 'b', 'c'])
pd.DataFrame([a,b,c])
df2
df2.rename(columns={'국어':'kor', '과학':'Sci'})
df2.reset_index()
df2.reset_index(drop=True)
df2.set_index('국어')
df2
df2.reset_index().set_index('국어')
대부분의 함수들이 원본변화 안시킨다. 원본 변화 발생시키려면 inplace=True
df3 = df2
df3
df3.set_index('국어',inplace=True)
df3
pd.DataFrame({'k':[10]})
pd.DataFrame({('k0', 'k1') : [10]})
pd.DataFrame({('k0', 'k1') : {'a':10, 'b':40}})
pd.DataFrame({('k0', 'k1') : {('a1', 'a2'):10, ('b1', 'b2'):40}})
pd.DataFrame({
('k', 'k1') : [10, 20, 30, 31],
('k', 'k2') : [40, 50, 60, 61],
('j', 'j1') : [70, 80, 90, 91],
('j', 'j2') : [100, 110, 120, 121],
}, index = [['서울','서울', '경기', '경기'], ['평일','휴일', '평일', '휴일']])
df = load_titanic()
df.head()
df['Survived'] # 결과값은 Series
df.Survived # 결과값은 Series
df.Age
df[['Survived']] # numpy때도 배웠지만 [안에 []를 넣게 되면 차원축소 안됨.]
df[['Survived', 'Age', 'Name']]
(인덱싱 용이 아니다!!)df.head(15)
df[:10]
df[7:10]
df[::10] # 10개씩 건너 뛴다.
df.head()
df.index = np.arange(len(df)) + 100
df
df.loc[986]
df.loc[[986]]
df.loc[[986, 100, 110, 990]]
df.loc[np.arange(100, 105)]
df[100:105] # 첫번째 행을 0이라고 생각했을 때 기준으로 실행하여 위 코드와 결과 다름!!!
df.iloc[0] # 0번째 row
df.iloc[[0]]
df.iloc[[0, 100, 200, 2]]
df.head(3)
df[:3]
df.iloc[:3] # 3개 전부 동일한 결과 나옴.
loc[ ], iloc[ ] 속성을 이용할때, 콤마를 이용하여 둘다 명시 가능
df.tail()
df.loc[986, 'Survived']
df.iloc[-5, 1] # column도 0-base로 접근 가능!! 중요!!!
df.head()
df.iloc[2, 3]
df.loc[102, 'Name']
df.loc[[986, 100, 110, 990],['Survived', 'Age', 'Name', 'Sex']]
df.loc[[986, 100, 110, 990]][['Survived', 'Age', 'Name', 'Sex']]
df[['Survived', 'Age', 'Name', 'Sex']].loc[[986, 100, 110, 990]]
df.loc[102, 'Name']
df['Name'][102]
df.iloc[2]['Name']
df.Pclass # 등급이 1,2,3
df.Pclass.unique()
df.Pclass.value_counts()
pclass_mask = df['Pclass'] == 1 # Boolean Mask
pclass_mask
df[pclass_mask] # 1등객실에 탄 탑승객만 나옴.
age_mask = (df.Age >= 30) & (df.Age < 40)
age_mask
df[age_mask]
df[age_mask & pclass_mask]
df[age_mask & pclass_mask]['Pclass', 'Age']]
결과 119명
sur_mask = df['Survived'] == 1
pclass_mask2 = df['Pclass'] == 3
len(df[pclass_mask2 & sur_mask])
((df['Pclass'] == 3) & (df['Survived'] ==1)).sum()
[결과 예시]
남성생존률 0.18890814558058924
여성생존률 0.7420382165605095
sex_mask = df['Sex'] == "male"
sex_mask2 = df['Sex'] == 'female'
df[sex_mask]['Survived'].mean()
df[sex_mask2]['Survived'].mean()
df['Age'] * 2
df['Age_Double'] = df['Age'] * 2 # 새로운 컬럼 추가
df
df['Age_triple'] = df.Age_Double + df.Age
df[['Age', 'Age_Double', 'Age_triple']]
df.insert(3,'Fare10', df['Fare'] / 10)
df.head()
df.drop('Age_triple', axis=1).head()
df.head()
df2 = pd.DataFrame([
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
], columns=['a','b','c','d'], index = ['김길동', '최진수', '허수민'])
df2
df2.loc['김갑수'] = pd.Series([100, 200, 300, 400], index=['a', 'b', 'c', 'd'])
df2
df2.loc['김철수'] = [101,202,303,404]
df2
df2.drop(['최진수', '허수민']) # axis = 0
df2
df2.iloc[:2]
df2.iloc[2:]
pd.concat([
df2.iloc[:2],
pd.DataFrame({'a':10, 'b':20, 'c':30, 'd':40}, index=['정태경']),
df2.iloc[2:],
])
df_t = df2.T
df_t.insert(2,'정태경', [10, 20, 30, 40])
df_t.T
df = load_titanic()
df.head()
df.corr()
import matplotlib.pyplot as plt
plt.matshow(df.corr())
df.info()
df.info()
df['Pclass'] = df['Pclass'].astype(str)
df.info()
def age_categorize(age) :
if np.isnan(age) :
return -1
return int(age/10) * 10
age_categorize(34)
age_span = df['Age'].apply(age_categorize)
age_span
age_span.unique()
df['Age_span'] = age_span
df
범주형(categorical) 데이터 전처리
df['Pclass'].unique()
pd.get_dummies(df)
pd.get_dummies(df, columns = ['Pclass', 'Sex'])
pd.get_dummies(df, columns = ['Pclass', 'Sex'], drop_first=True)
df.info()
df.isna()
df['Age'].isna()
df[df['Age'].isna()] # 결측된 데이터만 뽑기
df.dropna()
df.dropna(subset=['Age']) # Age 컬럼이 NaN인 경우만 해당 row가 drop됨
df.dropna(axis=1)
df['Age'].mean() # 집계함수는 NaN값을 배제하고 연산!!
df['Age'].fillna(df['Age'].mean())
df = load_titanic()
df.head()
grouped_pclass = df.groupby('Pclass')
grouped_pclass # DataFrameGroupBy 객체
grouped_pclass.groups # [인덱스 값] 임.
grouped_pclass.size() # 그룹별 데이터의 개수
grouped_gender = df.groupby('Sex')
grouped_gender
grouped_gender.groups
grouped_gender.size()
그룹별 DataFrame 리턴
grouped_pclass.get_group(1) # Pclass가 1인 그룹의 DataFrame 객체
grouped_gender.get_group('female').head()
grouped_pclass.count()
grouped_pclass.sum()
grouped_pclass.mean()['Age']
grouped_pclass.mean()['Survived']
grouped_multi = df.groupby(['Pclass', 'Sex'])
grouped_multi
grouped_multi.size()
grouped_multi.mean()
grouped_multi.mean().Survived
df.head()
df.set_index(['Pclass', 'Sex'])
df.set_index('Embarked').groupby(level=0).mean()
df.set_index('Age')
df.set_index('Age').groupby(age_categorize)
df.set_index('Age').groupby(age_categorize)['Survived'].mean()
"""
A 51
B 72
C 69
D 43
...
...
U 1
V 15
W 33
Y 7
Z 3
"""
None
def pass_name(name) :
return name[0].upper()
df.set_index('Name').groupby(pass_name).size()
df.groupby(['Pclass', 'Sex']).sum()
df.groupby(['Pclass', 'Sex']).aggregate(np.sum)
df.groupby(['Pclass', 'Sex']).agg(np.sum)
df.groupby(['Pclass', 'Sex']).agg('sum') # 기본 집계함수는 문자열로 전달해도 동작한다.('sum', 'mean', 'count', ...)
df.groupby(['Pclass', 'Sex']).agg(['mean', 'sum', np.max])
df = pd.DataFrame({
'지역': ['서울', '서울', '서울', '경기', '경기', '부산', '서울', '서울', '부산', '경기', '경기', '경기'],
'요일': ['월요일', '화요일', '수요일', '월요일', '화요일', '월요일', '목요일', '금요일', '화요일', '수요일', '목요일', '금요일'],
'강수량': [100, 80, 1000, 200, 200, 100, 50, 100, 200, 100, 50, 100],
'강수확률': [80, 70, 90, 10, 20, 30, 50, 90, 20, 80, 50, 10]
})
df
df.T # 차원 축이 바뀐것. 2차원에선 행과 열이 바뀜.
df
df.pivot(index='지역', columns='요일')
df
df.loc[len(df)] = pd.Series(['경기', '금요일', 111, 11], index=["지역", "요일", "강수량", "강수확률"])
df
df.drop([len(df) - 1], inplace=True)
df
df.pivot('요일', '지역', values='강수량')
df.pivot('요일', '지역')['강수량']
pd.pivot_table(df, index='지역', columns='요일')
df2 = pd.DataFrame({
'지역': ['서울', '서울', '서울', '경기', '경기', '부산', '서울', '서울', '부산', '경기', '경기', '경기'],
'요일': ['월요일', '월요일', '수요일', '월요일', '화요일', '월요일', '목요일', '금요일', '화요일', '수요일', '목요일', '금요일'],
'강수량': [100, 80, 1000, 200, 200, 100, 50, 100, 200, 100, 50, 100],
'강수확률': [80, 70, 90, 10, 20, 30, 50, 90, 20, 80, 50, 10]
})
df2 # 서울 - 월요일 <-- 2개 있다.
df2.pivot_table(df2, index='지역', columns='요일', aggfunc=np.mean)
stack : 컬럼 레벨에서 인덱스 레벨(row 레벨)로 dataframe 변경
즉, 데이터를 쌓아올리는 개념으로 이해하면 쉬움
unstack : 인덱스 레벨에서 컬럼 레벨로 dataframe 변경
stack의 반대 operation
둘은 역의 관계에 있음
df
new_df = df.set_index(['지역', '요일'])
new_df
new_df.unstack() # level -1을 컬럼레벨로 올림.
new_df.unstack(0) # levle = 0
df2 = new_df.unstack(0)
df2
df2.stack() # level = -1
df2.stack(0)
df2.stack()
df2.stack().stack() # 모든 컬럼이 인덱스로 내려오면 -> Series 객체 반환.
new_df
new_df.unstack('지역').stack() # 인덱스 '지역'과 '요일'을 바꿈.
DataFrame 병합
df1 = pd.DataFrame({'key1' : np.arange(10), 'value1' : np.random.randn(10)})
df2 = pd.DataFrame({'key1' : np.arange(10), 'value1' : np.random.randn(10)})
df1
df2
pd.concat([df1,df2]) # 행(row) 단위로 병합 (axis=0)
pd.concat([df1,df2], axis=1)
df3 = pd.DataFrame({'key2' : np.arange(10), 'value2' : np.random.randn(10)})
df3 # 컬럼명이 df1, df2 와는 다르다
pd.concat([df1, df3]) # 서로 없는 컬럼에는 NaN값으로 채워짐
pd.concat([df1,df3], axis=1)
df2
df2.index += 10
df2
pd.concat([df1,df2], axis = 1)
DataFrame의 병합과 조인
customer = pd.DataFrame({'customer_id' : np.arange(6),
'name' : ['철수'"", '영희', '길동', '영수', '수민', '동건'],
'나이' : [40, 20, 21, 30, 31, 18]})
orders = pd.DataFrame({'customer_id' : [1, 1, 2, 2, 2, 3, 3, 1, 4, 9],
'item' : ['치약', '칫솔', '이어폰', '헤드셋', '수건', '생수', '수건', '치약', '생수', '케이스'],
'quantity' : [1, 2, 1, 1, 3, 2, 2, 3, 2, 1]})
customer
orders
pd.merge(customer, orders, on = 'customer_id')
pd.merge(customer, orders, on = 'customer_id')
pd.merge(customer, orders, on='customer_id', how='left') # left 는 customer
pd.merge(customer, orders, on='customer_id', how='right')
pd.merge(customer, orders, on='customer_id', how='outer') # outer = left + right
cust1 = customer.set_index('customer_id')
cust1
order1 = orders.set_index('customer_id')
order1
pd.merge(cust1, order1, left_index=True, right_index=True)
orders
pd.merge(customer, orders, on='customer_id', how='right')
pd.merge(customer, orders, on='customer_id', how='right').groupby('item')['quantity'].sum()
pd.merge(customer, orders, on='customer_id', how='right').groupby('item')['quantity'].sum().sort_values(ascending=False)
pd.merge(customer, orders, on='customer_id', how='right').groupby('item')['quantity'].sum().sort_values(ascending=False)[:1]
cust1.join(order1)
cust1.join(order1, how = 'inner')