스터디노트 16일차

손성우 (sacn1129)·2024년 2월 19일

SQL

목록 보기
15/57

-Pivot

Indicator을 삭제하고 First Tooltip 컬럼에서 신뢰구간에 해당하는 표현을 지워라
df.drop('Indicator',axis=1,inplace=True)
df['First Tooltip'] = df['First Tooltip'].map(lambda x: float(x.split("[")[0]))
#drop = 삭제 , 삭제할때도 행을 삭제할때 axis=1 , 열을 삭제할때는 axis=0
#x.split("["[0])의 뜻은 [ 을기준으로 나눠서 0번쨰 것을 가져온다는 뜻

년도가 2015년 이상, Dim1이 Both sexes인 케이스만 추출하라
target = df[(df.Period >=2015) & (df.Dim1 =='Both sexes')]

위의 문제에서 추출한 데이터로 아래와 같이 나라에 따른 년도별 사망률을 데이터 프레임화 하라
Ans = target.pivot(index='Location',columns='Period',values='First Tooltip')
#pivot ( Index , column , values)는 세트로 생각해야됨

Dim1에 따른 년도별 사망비율의 평균을 구하라
Ans = df.pivot_table(index='Dim1',columns='Period',values='First Tooltip',aggfunc='mean')
Ans.iloc[:,:4]
#aggfunc = 무슨 연산을 할건지 고르는것 , mean이면 평균 구하기

데이터에서 한국 KOR 데이터만 추출하라
kr = df[df.Country=='KOR']
#정말 KOR만 가져온지 확인하는법 : kr.Country.unique()로 확인가능

한국 올림픽 메달리스트 데이터에서 년도에 따른 medal 갯수를 데이터프레임화 하라
Ans = kr.pivot_table(index='Year',columns='Medal',aggfunc='size').fillna(0)
#size = 세다 , 수를세다.
#여기 테이터 테이블의 칼럼이 Bronze , Gold , Silver 이기 때문에 Gold Silver Bronze로 바꾸기
->Ans[['Gold', 'Silver', 'Bronze']]

전체 데이터에서 sport종류에 따른 성별수를 구하여라
df.pivot_table(index='Sport',columns='Gender',aggfunc='size')

전체 데이터에서 Discipline종류에 따른 Medal수를 구하여라
Ans = df.pivot_table(index='Discipline',columns='Medal',aggfunc='size')

!pivot과 pivot_table 차이

-Merge , Concat

데이터를 나눠보기
df1 = df.iloc[:4,:] : 0,1,2,3열+ 모든행 가져오기
df2 = df.iloc[4:,:] : 4~모든열 + 모든행 가져오기

df1과 df2 데이터를 하나의 데이터 프레임으로 합쳐라
total = pd.concat([df1,df2], axis=0)
#axis=0은 열을 붙힌다.

데이터 나눠보기
df3 = df.iloc[:2,:4] : 0,1열 + 0,1,2,3행
df4 = df.iloc[5:,3:] : 5~모든열 + 3~모든행

df3과 df4 데이터를 하나의 데이터 프레임으로 합쳐라. 둘다 포함하고 있는 년도에 대해서만 고려한다
Ans = pd.concat([df3,df4],join='inner')
#join = inner을 쓰면 공통으로 가지고 있는 칼럼만 가져온다.

df3과 df4 데이터를 하나의 데이터 프레임으로 합쳐라. 모든 컬럼이 출력될 수 있도록 고려하라
Ans = pd.concat([df3,df4],join='outer').fillna(0)
#join = outer 합집합이라는 뜻 , 이때 null값이 생기기 때문에 0으로 채워준다.

데이터 나눠보기
df.set_index('Location', inplace = True) : INDEX는 Location으로 고정
df5 = df.T.iloc[:7,:3] : 0~6열 + 0~2행 에서 행과 열의 데이터가 바뀐것
df6 = df.T.iloc[6:,2:5] :6~모든열 + 2,3,4행 에서 행과 열의 데이터가 바뀐것

df5과 df6 데이터를 하나의 데이터 프레임으로 merge함수를 이용하여 합쳐라. Algeria컬럼을 key로 하고 두 데이터 모두 포함하는 데이터만 출력하라
Ans = pd.merge(df5,df6,on='Algeria',how='inner')
#inner 방식으로 붙힐것이다(교집합) , df5와 df6에서 Algeria가 같은 값을 가진 데이터만 출력

df5과 df6 데이터를 하나의 데이터 프레임으로 merge함수를 이용하여 합쳐라. Algeria컬럼을 key로 하고 합집합으로 합쳐라
Ans =pd.merge(df5,df6,on='Algeria',how='outer').fillna(0)
#outer 방식으로 붙힐것이다(합집합) , df5와 df6에서 Algeria를 기준으로 모든 데이터를 붙힌다.

#concat은 합치는 개념 , merge는 join의 개념
#concat = 축방향으로 합친다 , merge는 on 과 how를 이용해서 합집,교집을 할건지 join의 개념

-Statistics

'Unnamed: 0' and 'Id'를 제거하라
del df['Unnamed: 0'] : deletes 'Unnamed: 0'

del df['Id'] : deletes 'Id'

#다른 방식으로 df2 = df[['Name', 'Year', 'Gender', 'State', 'Count']] 처럼 표현 할 수 있다.

데이터셋에 남성 이름이 더 많나요, 아니면 여성 이름이 더 많나요?
df['Gender'].value_counts()

데이터셋을 이름별로 그룹화여 'Count'를 Sum하고, names라는 변수에 할당
names = pd.DataFrame(df.groupby('Name')['Count'].sum())
names.sort_values(by=['Count'], ascending=0).head(5)
#pd.DataFrame을 하지않으면 Series 타입이다 그래서 데이터프레임화 한다.
#sorting은 그냥 포기 편하게 , 가격을 내림차순한다.
#sort_values(by=['Count']) 이게 맞는 형태고 sort_valus('Count')라고 해도 된다.

서로 다른 이름은 총 몇개인가요?
df['Name'].nunique()

가장 많이 등장한 이름은?
names[names.Count == names.Count.max()]

가장 적게 등장한 이름은 몇개인가요?
len(names[names.Count == names.Count.min()])

중앙값(median)의 개수를 가지고 있는 이름은?
names[names.Count == names.Count.median()]
#중앙값은 평균값이 아니고 데이터의 중간에 있는 값을 말한다.

이름 개수(Count)의 표준편차를 구하시오
names.Count.std()
#std()는 표준편차를 구하는 것 , var()는 분산을 구하는 것

names의 평균, 최소, 최대, 표준편차, 4분위수를 계산하시오
names.describe()

-Series & DataFrame

컬럼의 순서를 name, type, hp, evolution, pokedex로 변경하시오
df = df[['name', 'type', 'hp', 'evolution','pokedex']]

새로운 컬럼을 생성하고 임의의 값을 할당하시오
df['place'] = ['sea','mountain','lake','forest']
#place라는 칼럼을 만들고 sea,moutain,lake,forset 라는 값을 넣었다.

각 컬럼에 대한 타입을 확인하시오
df.info() 또는 df.dtypes()

hp가 40이상인 데이터를 출력하시오
df[df['hp'] >= 40]

name과 type만 출력하시오
df[['name', 'type']]

데이터 세트에 인덱스를 one, two, three, four로 변경하시오. (새로운 객체에 할당 할 것)
df2 = df.copy()
df2.index = ['one', 'two', 'three', 'four']
#copy()로 df의 데이터를 df2로 복사하고 df2의 index를 바꾼다.

name을 인덱스로 설정하시오
df2.set_index('name', inplace=True)
#원래 있던 index를 없애고 새로 바꿀때는 set_index를 쓴다. , inplace = True를 적지 않으면 df2에 데이터에 영구적인 반영X

데이터 세트를 csv파일로 저장하시오
df2.to_csv('sample.csv')
#import os , os.getcwd() 를 하면 현재 디렉토리를 볼 수 있고 os.chdir('특정경로') 하면 특정경로를 설정할 수 있다.

새로운 데이터 프레임을 생성하고, 기존 데이터 프레임과 병합하시오
new_df = pd.DataFrame({"name": ['Pikachu'],
"type": ['electric'],
"hp": [35],
"evolution": ['Raichu'],
"pokedex": ['yes'],
"place": ['forest']})

Ans = pd.concat([df, new_df], axis=0).reset_index(drop=True)
#reset_index를 안쓰면 index가 꼬인다.

Ans에서 place 1번째와 3번째 row에 NaN값을 입력하시오
import numpy as np
Ans.loc[[0,2],'place'] = np.nan
#loc[ [ 0,2 ] , 'place'] 는 , 를 기준으로 앞이 열이니까 0열과 2열이고 , place는 행이다 그래서 0열 place랑 2열 place를 의미
#null값을 지정할떄는 np.nan이라고 함

-Visualization(시각화)
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
sns.set_style("white")
#import하는 것들은 시각화를 필요한 라이브러리를 가져오는 것이다.
#matplot과 seaborn을 각각 plt와 sns로 가져온다.
#%matplotlib inline : 구글 colab에서는 안써도 되지만 다른 것에서는 저걸 써야한다.

'Unnamed: 0' Column을 삭제하시오
del df['Unnamed: 0']

total_bill에 대해서 히스토그램을 그리시오
ttbill = sns.histplot(df.total_bill);
ttbill.set(xlabel = 'Value', ylabel = 'Frequency', title = "Total Bill");
#히스토그램을 그리는 명령어는 sns.histplot(데이터)이다. , 히스토그림 : (데이터)의빈도수를 포현한 막대그래프
#.set은 x와 y를 정하고 title까지 정한다.

total_bill과 tip에 대해서 jointplot을 그리시오
sns.jointplot(x ="total_bill", y ="tip", data = df);
#중앙에는 산점도를 그리고 , 각각 x축 y축에 히스토그램을 또 그린다.

모든 연속성 변수에 대해서 pairplot을 그리시오
sns.pairplot(df);
#쌍으로 만들수 있는 모든 데이터를 산점도와 히스토그램을 그리는 것 , 이때 숫자형 연속형 변수만 그림
#자기 자신은 히스토그램으로 그리고 나머지 다른 관계를 가진애들은 산점도로 그려줌 , 잘안씀

day에 따라 total_bill의 관계를 파악하기 위한 stripplot을 그리시오
sns.stripplot(x = "day", y = "total_bill", data = df);

day와 성별(sex)에 따라 tip의 관계를 파악하기 위한 stripplot을 그리시오 ( x축 - tip, y축 - day)
sns.stripplot(x = "tip", y = "day", hue = "sex", data = df);
#day도 범주형 , sex도 범주형이라서 한차원을 더 추가해야한다.
#hue = "sex"를 추가해서 비교한다.

day와 time에 따라 total_bill의 관계를 파악하기 위한 boxplot을 그리시오 ( x축 - day, y축 - total_bill)
sns.boxplot(x = "day", y = "total_bill", hue = "time", data = df);

저녁(Dinner)과 점심(Lunch)을 기준으로 한 팁 값에 대해 두 개의 히스토그램을 생성하세요.
sns.set(style = "ticks")
plt.grid(True)
#이건 안쳐도 되는것들 , 치면 그냥 보기좋게 해주는용
g = sns.FacetGrid(df, col = "time")
g.map(plt.hist, "tip");
#Facegrid를 그린다 , time에는 dinner와 lunch 2개 이기때문에 time의 전체를 나누어서 히스토그램을 그린다.

남성과 여성을 대상으로 한 두 개의 산점도 그래프를 생성하세요. 이 그래프들은 전체 청구 금액(total_bill)과 팁(tip) 간의 관계를 보여주며, 흡연자와 비흡연자로 구분되어야 합니다.
g = sns.FacetGrid(df, col = "sex", hue = "smoker")
g.map(plt.scatter, "total_bill", "tip", alpha =.7)
g.add_legend();
#alpha는 투명도 , add_legend는 범레를 표현한다는 의미
#g.map(plt.scatter , x축 , y축) 이다.

남성과 여성의 비율을 나타내는 파이 차트를 생성하세요.
males = (df['Sex'] == 'male').sum()
females = (df['Sex'] == 'female').sum()
proportions = [males, females]
plt.pie(
proportions,

labels = ['Males', 'Females'],

shadow = False,

colors = ['blue','red'],

explode = (0.15 , 0),

startangle = 90,

autopct = '%1.1f%%'
)

plt.axis('equal')

plt.title("Sex Proportion")

plt.tight_layout()
plt.show()

#shadow~autopct는 안써도 되는데 그래프의 상세정보를 표현한 것이다.
#proportions 과 labels만 정해도 그려지긴한다.

지불한 요금(Fare)과 나이(Age)를 나타내는 산점도를 생성하세요. 그래프의 색상은 성별에 따라 달라져야 합니다.(Implot)
lm = sns.lmplot(x = 'Age', y = 'Fare', data = df, hue = 'Sex', fit_reg=False)

lm.set(title = 'Fare x Age')

axes = lm.axes
axes[0,0].set_ylim(-5,) : y축은 -5부터 전체를 표현하게 제한을 두는것
axes[0,0].set_xlim(-5,85) : x축은 -5부터 85까지 표현하게 제한을 두는것
#implot에서 fit_reg = True를 하면 회계선을 같이 표현해준다 , 선형관계를 보고 싶을때 true를 한다.

지불한 요금(Fare)에 대한 히스토그램을 생성하세요
import numpy as np
df2 = df.Fare.sort_values(ascending = False)

binsVal = np.arange(0,600,10)
binsVal

plt.hist(df3, bins = binsVal)

plt.xlabel('Fare')
plt.ylabel('Frequency')
plt.title('Fare Payed Histrogram')

plt.show()
#binsVal은 bin을 만든다는 뜻이다. 이것을 0부터 590까지 10단위의 배열을 만든다.
#df2 = df.Fare.sort_values(ascending = False) 내림차순으로 정렬한것은 최대 데이터가 얼만지 알아서 최대범위를 구할라고

-Deleting

Column명을 아래와 같이 변경하세요.
#1. sepal_length
#2. sepal_width
#3. petal_length
#4. petal_width
#5. class
df.columns = ['sepal_length','sepal_width', 'petal_length', 'petal_width', 'class']

Column별 NA값이 존재하는지 확인하세요.
df.isnull().sum()
'petal_length'의 10번째부터 29번째 행의 값을 NaN으로 변환하세요.
df.iloc[9:29,2] = np.nan

Nan값을 다시 1로 채워 넣으세요.
df.petal_length.fillna(1, inplace = True)
df.petal_length.isnull().sum()

Class 컬럼을 삭제하세요.
del df['class'] -> df = df[['sepal_length','sepal_width', 'petal_length','petal_width']] 이걸추천

3개의 행에 대해서 모두 Nan값으로 변경하세요
df.iloc[0:3 ,:] = np.nan

NaN을 가지고 있는 행을 삭제하시오
df = df.dropna(how='any')
#how='any' : 행에 어디든 null이 있으면 지운다는 뜻

index를 다시 0부터 시작할 수 있도록 수정하세요.
df = df.reset_index(drop = True)

profile
안녕하세용

0개의 댓글