Pandas 더 많은 행과 열 출력하기
import pandas as pd print("pandas version: ", pd.__version__) pd.set_option('display.max_row', 500) pd.set_option('display.max_columns', 100)
import numpy as np
import pandas as pd
data = pd.read_csv('titanic.csv')
dict = {'열인덱스' : [1, 2, 3, 4, 5],
'열인덱스2' : [10, 20, 30, 40, 50]}
print(dict)
df_test = pd.DataFrame(dict)
display(df_test)
display('-'*20 + '상위 5행' + '-'*20)
display(df.head()) # 상위 5개
display('-'*20 + '하위 5행' + '-'*20)
display(df.tail()) # 하위 5개
display('-'*20 + '컬럼명들을 확인' + '-'*20)
display(df.columns) # 칼럼명들 확인
display('-'*20 + 'array 형태로 확인' + '-'*20)
display(df.columns.values) # array 형태로 확인
display('-'*20 + 'list 형태로 확인' + '-'*20)
display(list(df)) # list 형태로 확인
display('-'*20 + '열 자료형 확인' + '-'*20)
display(df.dtypes) # 열 자료형 확인
display('-'*20 + '자료형, 값, 개수 확인' + '-'*20)
display(df.info()) # 자료형, 값, 개수 확인
display('-'*20 + '기초통계량 확인' + '-'*20)
display(df.describe()) # 기초통계량 확인
print('\033[43m' + ' '*30 + '\033[0m' + ' 2열만 따로 describe (describe) ' + '\033[43m' + ' '*30)
display(data[['Age', 'Fare']].describe()) # 2열만 따로 describe
print('\033[43m' + ' '*30 + '\033[0m' + ' Age가 적은 순서부터, 같은 값일 경우 Fare가 큰 순서 부터 (sort_values) ' + '\033[43m' + ' '*30)
temp = data.sort_values(by = ['Age', 'Fare'], ascending = [True, False]) # Age가 적은 순서부터, 같은 값일 경우 Fare가 큰 순서 부터
display(temp)
print('\033[43m' + ' '*30 + '\033[0m' + ' 인덱스 리셋, False하면 원래 인덱스가 안으로 들어가고 새로 리셋됨 (reset_index) ' + '\033[43m' + ' '*30)
display(temp.reset_index(drop = True)) # 인덱스 리셋, False하면 원래 인덱스가 안으로 들어가고 새로 리셋됨
print('\033[43m' + ' '*30 + '\033[0m' + ' survived에 어떤 요소가 있는지 (unique), 어떤 요소가 몇개 있는지 (value_counts), 요소의 종류 개수가 몇개인지 (nunique) ' + '\033[43m' + ' '*30)
display(data['Survived'].unique()) # 어떤 요소가 있는지 보여줌
print("0은 사망, 1은 생존")
display(data['Survived'].value_counts()) # 어떤 요소가 몇개 있는지까지 보여줌
display(data['Survived'].nunique()) # 요소의 종류 개수를 보여줌
between은 파라미터의 값에 따라 부등호의 형태가 결정된다
이상의 위치를 조절하는 inclusive, both면 이상이하, neither이면 초과미만, left면 이상미만, right면 초과이하
loc는 :으로 범위를 넣으면 이상이하로 작동됨 (헷갈림 주의)
iloc는 :으로 범위를 넣으면 이상미만으로 작동됨
print('\033[43m' + ' '*30 + '\033[0m' + ' age가 4, 1인 것만 보여줌 (isin) ' + '\033[43m' + ' '*30)
display(data.loc[data['Age'].isin([4, 1])]['Age'].head()) # age가 4, 1인 것만 보여줌
print('\033[43m' + ' '*30 + '\033[0m' + ' 10이상 20이하의 값을 보여줌 (between) ' + '\033[43m' + ' '*30)
display(data.loc[data['Age'].between(10, 20)]['Age'].head(10)) # 10이상 20이하의 값을 보여줌
display(data.loc[data['Age'].between(10, 20, inclusive = 'left')]['Age'].head(10)) # 이상의 위치를 조절하는 inclusive, both면 이상이하, neither이면 초과미만, left면 이상미만, right면 초과이하
print('\033[43m' + ' '*30 + '\033[0m' + ' Age가 30세 이상인 행의 Sex, Name, Age출력 (loc) ' + '\033[43m' + ' '*30)
display(data.loc[data['Age'] > 30, ['Sex', 'Name', 'Age']])
print('\033[43m' + ' '*30 + '\033[0m' + ' data의 0~5행, Age열을 가져옴 (0~5) (loc) ' + '\033[43m' + ' '*30)
display(data.loc[0 : 5, ['Age']]) # data의 0~5행, Age열을 가져옴 (0~4아님)
print('\033[43m' + ' '*30 + '\033[0m' + ' data의 0~4행, 0~2열을 가져옴 (0~4) (iloc) ' + '\033[43m' + ' '*30)
display(data.iloc[0 : 5, 0 : 3]) # 얘는 0~4까지 가져옴
print('\033[43m' + ' '*30 + '\033[0m' + ' 성별별 요금 각각의 개수, as_index가 True면 Sex가 인덱스 / False면 새로 인덱스를 만듬 (groupby) ' + '\033[43m' + ' '*30)
display(data.groupby(by = ['Sex'], as_index = True)['Fare'].value_counts()) # 성별별 요금 각각의 개수, as_index가 True면 Sex가 인덱스 / False면 새로 인덱스를 만듬
print('\033[43m' + ' '*30 + '\033[0m' + ' 성별별 요금, 클래스의 max, min, nunique (agg) ' + '\033[43m' + ' '*30)
display(data.groupby(by = ['Sex'], as_index = True)[['Fare', 'Pclass']].agg(['max', 'min', 'nunique'])) # agg는 들어있는 모든 함수를 표현해줌, groupby 최고 응용
print('\033[43m' + ' '*30 + '\033[0m' + ' 특정 컬럼명을 바꾸기 (rename) ' + '\033[43m' + ' '*30)
display(data.rename(columns = {'Pclass' : 'PC', 'Survived' : 'SV'}, inplace = False).iloc[:, 3 : 5]) # inplace = False라 실제로 값이 바뀌지는 않음, 특정 컬럼명만 바꾸기
print('\033[43m' + ' '*30 + '\033[0m' + ' Dataframe의 컬럼명 직접 변경 ' + '\033[43m' + ' '*30)
df_test = pd.DataFrame({"test1" : [0, 1, 2, 3, 4], "test2" : [5, 4, 3, 2, 1]})
df_test.columns = ['1번', '2번'] # 모든 칼럼명을 바로 바꾸려면 이렇게도 가능함
display(df_test)
print('\033[43m' + ' '*30 + '\033[0m' + ' age 컬럼을 3등분해서 각각의 범위를 설정함 (cut) ' + '\033[43m' + ' '*30)
data['Age_range'] = pd.cut(data['Age'], 3, labels = ['childs', 'middle','adults']) # age 컬럼을 3등분해서 각각의 범위를 설정함
print('\033[43m' + ' '*30 + '\033[0m' + ' male은 1로, female은 2로 (map) ' + '\033[43m' + ' '*30)
data['Gen'] = data['Sex'].map({'male' : 1, 'female' : 0}) # male은 1로, female은 2로
print('\033[43m' + ' '*30 + '\033[0m' + ' 요금이 30이하인 사람은 under30, 이상인 사람은 over30 (where) ' + '\033[43m' + ' '*30)
data['Fare_range'] = np.where(data['Fare'].between(0, 30), 'under30', 'over30') # 요금이 30이하인 사람은 under30, 이상인 사람은 over30
display(data)
print('\033[43m' + ' '*30 + '\033[0m' + ' 몇세부터 몇세까지 childs인지, 몇세부터 몇세까지 middle인지... 이 범위를 알려줌 (agg 응용) ' + '\033[43m' + ' '*30)
display(data.groupby(['Age_range'], as_index = False)['Age'].agg(['min', 'max'])) # 나이 범위별 나이 (그니까 각 나이 범위의 최댓값, 최솟값) // 즉 나눈 구간의 범위를 알려줌
# tip: 음의 무한대는 -np.inf, 양의 무한대는 np.inf