본문 바로가기

멀티캠퍼스 프로젝트형 AI 서비스 개발 5회차/ML

3/21 월

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

'멀티캠퍼스 프로젝트형 AI 서비스 개발 5회차 > ML' 카테고리의 다른 글

3/23 수  (0) 2022.03.23
3/22 화  (0) 2022.03.22
3/18 금  (0) 2022.03.18
3/17 목  (0) 2022.03.17
3/16 수  (0) 2022.03.16