728x90
월요일!
오늘은 Pandas의 DataFrame(DataFrame 연결 · 결합, Mapping, Grouping)을 마무리 짓고,
내일부터 데이터의 시각화에 대해 배운다.
1. DataFrame 연결 : pd.concat(). default는 행 방향으로 연결. 컬럼 명이 같은 것들이 서로 결합됨
import numpy as np
import pandas as pd
df1 = pd.DataFrame({'a':['a0', 'a1', 'a2', 'a3'],
'b':[1, 2, 3, 4],
'c':['c0', 'c1', 'c2', 'c3']},
index=[0, 1, 2, 3])
display(df1)
df2 = pd.DataFrame({'b':[5, 6, 7, 8],
'c':['c0', 'c1', 'c2', 'c3'],
'd':['d0', 'd1', 'd2', 'd3'],
'e':['e0', 'e1', 'e2', 'e3']},
index=[2, 3, 4, 5])
display(df2)
result_df = pd.concat([df1, df2], axis=0) # 기존의 index 유지하면서 연결
display(result_df)
result_df1 = pd.concat([df1, df2], axis=0, ignore_index=True) # 기존의 index 없애고 숫자 index를 다시 설정
display(result_df1)
result_df2 = pd.concat([df1, df2], axis=1) # 행 index를 기준으로 결합
display(result_df2)
2. DataFrame 결합 : pd.merge(). Merge(SQL Inner Join 같은 것)
data1 = {'학번':[1, 2, 3, 4],
'이름':['홍길동', '김연아', '아이유', '신사임당'],
'학년':[3, 2, 1, 4]}
df1 = pd.DataFrame(data1)
display(df1)
data2 = {'학번':[1, 2, 3, 4],
'학과':['철학과', '수학과', '컴퓨터', '국어국문'],
'학점':[1.2, 3.3, 2.7, 4.0]}
df2 = pd.DataFrame(data2)
display(df2)
data3 = {'학번':[1, 2, 4, 5],
'학과':['철학과', '수학과', '컴퓨터', '국어국문'],
'학점':[1.2, 3.3, 2.7, 4.0]}
df3 = pd.DataFrame(data3)
# display(df3)
result_df = pd.merge(df1, df2, on='학번', how='inner') # on=결합 기준, how=Inner Join(학번이 일치하는 것들만 결합)
display(result_df)
result_df = pd.merge(df1, df3, on='학번', how='inner') # 학번 3, 5는 제외하고 결합
display(result_df)
3. DataFrame 결합 : pd.merge(). Merge(SQL Outer Join 같은 것)
data1 = {'학번':[1, 2, 3, 4],
'이름':['홍길동', '김연아', '아이유', '신사임당'],
'학년':[3, 2, 1, 4]}
df1 = pd.DataFrame(data1)
display(df1)
data2 = {'학번':[1, 2, 4, 5],
'학과':['철학과', '수학과', '컴퓨터', '국어국문'],
'학점':[1.2, 3.3, 2.7, 4.0]}
df2 = pd.DataFrame(data2)
display(df2)
result_df = pd.merge(df1, df2, on='학번', how='outer') # how=Outer Join(빠진 것끼리 결합)
display(result_df)
result_df1 = pd.merge(df1, df2, on='학번', how='left') # how=Left Outer Join(좌측 DataFrame에 있는 것만 포함)
display(result_df1)
result_df2 = pd.merge(df1, df2, on='학번', how='right') # how=Right Outer Join(우측 DataFrame에 있는 것만 포함)
display(result_df2)
4. 결합하려는 기준 컬럼 명이 서로 다른 경우. left_on, right_on을 지정
data1 = {'학번':[1, 2, 3, 4],
'이름':['홍길동', '김연아', '아이유', '신사임당'],
'학년':[3, 2, 1, 4]}
df1 = pd.DataFrame(data1)
display(df1)
data2 = {'학생학번':[1, 2, 4, 5],
'학과':['철학과', '수학과', '컴퓨터', '국어국문'],
'학점':[1.2, 3.3, 2.7, 4.0]}
df2 = pd.DataFrame(data2)
display(df2)
data3 = {'학과':['철학과', '수학과', '컴퓨터', '국어국문'],
'학점':[1.2, 3.3, 2.7, 4.0]}
df3 = pd.DataFrame(data3,
index=[1, 2, 4, 5])
display(df3)
data4 = {'이름':['홍길동', '김연아', '아이유', '신사임당'],
'학년':[3, 2, 1, 4]}
df4 = pd.DataFrame(data4,
index=[1, 2, 3, 4])
display(df4)
result_df = pd.merge(df1, df2, left_on='학번', right_on='학생학번', # 결합하려는 기준 컬럼 명이 서로 다른 경우
how='inner')
display(result_df)
result_df1 = pd.merge(df1, df3, left_on='학번', right_index=True, # 결합하려는 기준 컬럼과 다른 DataFrame의 행 인덱스를 결합
how='inner')
display(result_df1)
result_df2 = pd.merge(df4, df3, left_index=True, right_index=True, # index 끼리 결합
how='inner')
display(result_df2)
5. Series 원소 각각에 함수를 Mapping. .apply()
import seaborn as sns
titanic = sns.load_dataset('titanic')
df = titanic.loc[:,['age', 'fare']] # Fancy Indexing
display(df.head())
# 사용자 정의 함수. 이렇게 사용하는 것은 일반적이지 않음 → lambda 식으로 적용
def add_10(n):
return n + 10
print(add_10(20))
def add_two_number(a,b):
return a + b
df['age'].head() # Series로 age 컬럼 가져오기
sr1 = df['age'].apply(add_10) # apply()로 함수 적용
print(sr1.head())
sr2 = df['age'].apply(add_two_number, b=30) # apply()로 함수 적용
print(sr2.head())
sr3 = df['age'].apply(lambda x: x + 10) # lambda 식. return 구문 사용하지 않음
print(sr3.head())
sr4 = df['age'] + 10 # 함수가 간단할 경우 scala, broardcasting을 사용
print(sr4.head())
6. DataFrame 원소 각각에 함수를 Mapping. df.applymap()
titanic = sns.load_dataset('titanic')
df = titanic.loc[:,['age', 'fare']]
display(df.head())
result_df = df.applymap(lambda x: x + 10) # applymap(). DataFrame 각각의 원소에 함수를 적용
display(result_df.head())
result_df = df + 10
display(result_df.head())
7. DataFrame 각 행과 각 열에 함수를 적용. df.apply()
titanic = sns.load_dataset('titanic')
df = titanic.loc[:,['age', 'fare']]
display(df.head())
def min_max(s): # apply() 함수를 사용하고, axis를 명시해야 함
return (s - s.min()) / (s.max() - s.min())
result_df = df.apply(min_max, axis=0) # DataFrame에 apply 적용할 때 *axis=0하면 열 단위* 1은 행 단위
display(result_df.head())
def add_two_number(a,b):
return a + b
df['add'] = df.apply(lambda x: add_two_number(x['age'], x['fare']), axis=1) # axis=1하면 행 단위
display(df.head())
8. Grouping. 복잡한 데이터를 어떤 기준에 따라 여러 그룹으로 나눠 관찰하기 위함
titanic = sns.load_dataset('titanic')
df = titanic.loc[:,['age', 'sex', 'class', 'fare', 'survived']]
display(df.head())
grouped = df.groupby(['class']) # 특정 칼럼에 대해 그룹핑
print(grouped)
for key, group in grouped: # 묶인 모든 그룹을 확인
print('key', key)
display(group.head())
result_df = grouped.get_group('Third') # 특정 그룹을 DataFrame으로 가져오고 싶을 때
display(result_df.head())
# 일단 그룹으로 묶이게 되면, 각 그룹에 대한 집계함수를 사용할 수 있음
my_mean = grouped.mean()
display(my_mean)
titanic = sns.load_dataset('titanic')
df = titanic.loc[:,['age', 'sex', 'class', 'fare', 'survived']]
display(df.head())
grouped = df.groupby(['class', 'sex']) # 총 그룹의 수는? 6. 1등석의 남/여, 2등석의 남/여, 3등석의 남/여
for key, group in grouped: # 묶인 모든 그룹을 확인
print(key)
display(group.head())
my_group = grouped.get_group(('First', 'female'))
display(my_group)
display(grouped.mean()) # 그룹 별 생존율
9. Group의 필터링
titanic = sns.load_dataset('titanic')
df = titanic.loc[:,['age', 'sex', 'class', 'fare', 'survived']]
display(len(df))
grouped = df.groupby(['class'])
grouped_filter = grouped.filter(lambda x: len(x) > 300) # 그룹 별 행의 개수가 300 이상인 것만 남겨라(등급 별 300명 이상)
# for key, group in grouped_filter:
# print(key)
# display(group)
display(grouped_filter.head())
10. 지난주부터 배운 Pandas를 이용해, 2가지 수행평가를 제출해야 한다. 😰
문제들 봤는데 감이 안 잡혀가지고, 제출하랄 때까지 배운 함수들 정리해서 미리미리 풀어놔야 할 듯..
으아아아앙
https://drive.google.com/drive/folders/1vQO2AWv9zmIGa-e8Uk3J2b3ZImq53KJT
1. 3/15 화 | 2. 3/16 수 | 3. 3/17 목 | 4. 3/18 금 | 5. 3/21 월 |
ML 환경 설정 (아나콘다, 주피터 노트북), Pandas, Numpy, ndarray |
ML Numpy, 행렬곱연산, 전치행렬, iterator, axis, Pandas, Series, DataFrame |
ML Pandas, DataFrame, 함수들 |
ML Pandas, 데이터 분석, 데이터 전처리 |
ML Pandas, 데이터 전처리, 수행평가 |
6. 3/22 화 | 7. 3/23 수 | 8. 3/24 목 | 9. 3/25 금 | 10. 3/28 월 |
ML 데이터 시각화 |
ML 데이터 시각화 |
ML 기술통계 |
ML |
* 컨디션 조절!
728x90