DATA ANALYSIS/TIL

[Day20] 데이터 핸들링(3)

yel1nk 2023. 5. 24. 17:35

Pandas

DataFrame (데이터 프레임)

  • 여러 개의 Series
  • 2차원 배열처럼 사용
  • 표, 테이블 형태
df = pd.DataFrame({
    '연차': [1, 2, 3],
    '연도': [2015, 2016, 2017],
    '매출': [10000, 20000, 30000]
})

Index (인덱스)

df.index
# RangeIndex(start=0, stop=3, step=1)
df.set_index('연도', inplace=True)

Column (컬럼, 열)

df.columns
# Index(['연차', '매출'], dtype='object')
df['매출']
'''
연도
2015    10000
2016    20000
2017    30000
Name: 매출, dtype: int64
'''

Data (데이터)

데이터 조회

df.loc[2016] # 레이블로 행을 가져옴
df.loc[2016:2017] # 2017 인덱스 포함 
df.loc[2016, '매출']
# 20000
df.iloc[1]
df.iloc[1:3] # 3 미포함

데이터 불러오고 살펴보기

  • read_csv() : 데이터 불러옴
  • head() : 상위 값 확인
  • tail() : 하위 값 확인
  • describe() : 기초 통계 내용
  • index : 어떤 인덱스로 되어 있는지
  • info() : col 값, null 값 유무, 데이터 타입(컬럼별)
data = pd.read_csv('/content/sample_data/california_housing_test.csv')

data.describe()
# data.head() # default 5행
# data.tail()

data.index
# RangeIndex(start=0, stop=3000, step=1)

data.info()
'''
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3000 entries, 0 to 2999
Data columns (total 9 columns):
 #   Column              Non-Null Count  Dtype  
---  ------              --------------  -----  
 0   longitude           3000 non-null   float64
 1   latitude            3000 non-null   float64
 2   housing_median_age  3000 non-null   float64
 3   total_rooms         3000 non-null   float64
 4   total_bedrooms      3000 non-null   float64
 5   population          3000 non-null   float64
 6   households          3000 non-null   float64
 7   median_income       3000 non-null   float64
 8   median_house_value  3000 non-null   float64
dtypes: float64(9)
memory usage: 211.1 KB
'''

데이터 타입 변환하기

  • astype()
# 원본 값 유지 -> 새로운 변수에 할당 
data_int = data.astype({'households': 'int', 'population': 'int', 
                        'housing_median_age': 'int', 'total_rooms': 'int', 
                        'total_bedrooms': 'int', 'median_house_value': 'int'})
data_int.info()
'''
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3000 entries, 0 to 2999
Data columns (total 9 columns):
 #   Column              Non-Null Count  Dtype  
---  ------              --------------  -----  
 0   longitude           3000 non-null   float64
 1   latitude            3000 non-null   float64
 2   housing_median_age  3000 non-null   int64  
 3   total_rooms         3000 non-null   int64  
 4   total_bedrooms      3000 non-null   int64  
 5   population          3000 non-null   int64  
 6   households          3000 non-null   int64  
 7   median_income       3000 non-null   float64
 8   median_house_value  3000 non-null   int64  
dtypes: float64(3), int64(6)
memory usage: 211.1 KB
'''
data['total_rooms'].mean()
data['total_rooms'].median()
data['total_rooms'].std()
data['longitude'].unique() # 속성값 중에서 유일한 값 출력
data['longitude'].value_counts() # 속성값에 대한 빈도수 출력

datetime

  • 날짜와 시간을 처리하게 해주는 함수
df = pd.DataFrame({
    '연차': [1, 2, 3],
    '연도': [2015, 2016, 2017],
    '매출': [10000, 20000, 30000]
})

date_df = pd.DataFrame({'Date': [
    '2023-01-01 11:25:00',
    '2023-01-02 11:25:00',
    '2023-01-03 11:25:00',
]})

df['Date'] = date_df # 크기를 맞춰서 값 추가

df.info()
'''
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3 entries, 0 to 2
Data columns (total 4 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   연차      3 non-null      int64 
 1   연도      3 non-null      int64 
 2   매출      3 non-null      int64 
 3   Date    3 non-null      object
dtypes: int64(3), object(1)
memory usage: 224.0+ bytes
'''
# 시계열 분석 데이터 변환 : object 타입 -> datetime64 타입
df['Date'] = pd.to_datetime(df['Date'], format='%Y-%m-%d %H:%M:%S')  

df.info()
'''
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3 entries, 0 to 2
Data columns (total 4 columns):
 #   Column  Non-Null Count  Dtype         
---  ------  --------------  -----         
 0   연차      3 non-null      int64         
 1   연도      3 non-null      int64         
 2   매출      3 non-null      int64         
 3   Date    3 non-null      datetime64[ns]
dtypes: datetime64[ns](1), int64(3)
memory usage: 224.0 bytes
'''
df['Date'].dt.date         # YYYY-MM-DD(문자)
df['Date'].dt.year         # 연(4자리숫자)
df['Date'].dt.month        # 월(숫자)
df['Date'].dt.month_name() # 월(문자)
df['Date'].dt.day          # 일(숫자)
df['Date'].dt.time         # HH:MM:SS(문자)
df['Date'].dt.hour         # 시(숫자)
df['Date'].dt.minute       # 분(숫자)
df['Date'].dt.second       # 초(숫자)

groupby

  • 데이터를 그룹별로 변환
      1. split: 원본 데이터에서 분류하고자하는 데이터를 나눠준다
      1. apply: 분류된 데이터(그룹별)에 함수 적용
      1. combine: 함수 적용된 데이터를 다시 합쳐줌
  • 기준 : 범주형 데이터 (남과 여, 지역 별, 혈액형, 국적, 학년, 반, MBTI ..)
  • 파악할 데이터 : 수치형 데이터
data = pd.DataFrame({
    '도시': ['서울', '부산', '제주', '서울', '제주', '제주', '부산', '부산', '제주'],
    '연도': [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023],
    '전입신고 수': [10040, 22300, 6000, 12400, 4000, 600, 11100, 45000, 31000],
    '세금': [1004000, 2230000, 600000, 1240000, 400000, 60000, 1110000, 4500000, 3100000]
})
# 도시 별 전입신고 수의 합
data.groupby('도시')['전입신고 수'].sum() # 인덱싱 함 -> Series 형식 
'''
도시
부산    78400
서울    22440
제주    41600
Name: 전입신고 수, dtype: int64
'''
# 도시, 연도 별 평균 
data.groupby(['도시', '연도']).mean() # 인덱싱 하지 않음 -> DataFrame 형식

데이터 결합

concat() : 행 방향, 열 방향 이어붙인다

df1 = pd.DataFrame([['A0', 'A1', 'A2', 'A3'],
                     ['B0', 'B1', 'B2', 'B3'],
                     ['C0', 'C1', 'C2', 'C3'],
                     ['D0', 'D1', 'D2', 'D3']], 
                   columns=list('ABCD'))

df2 = pd.DataFrame([['A4', 'A5', 'A6', 'A7'],
                     ['B4', 'B5', 'B6', 'B7'],
                     ['C4', 'C5', 'C6', 'C7'],
                     ['D4', 'D5', 'D6', 'D7']], 
                   columns=['A', 'B', 'C', 'D'], index=[4, 5, 6, 7])

df3 = pd.DataFrame([['A8', 'A9', 'A10', 'A11'],
                     ['B8', 'B9', 'B10', 'B11'],
                     ['C8', 'C9', 'C10', 'C11'],
                     ['D8', 'D9', 'D10', 'D11']], 
                   columns=list('ABCD'), index=[8, 9, 10, 11])
pd.concat([df1, df2, df3]) # defalut 행 병합

pd.concat([df1, df2, df3], ignore_index=True, axis=1) # 인덱스 재배열, 열 병합

join

Pandas에서 옵션 없이 join을 사용할 경우 기본 설정(default)는 Outer Join이 됩니다.

key 값으로 병렬할 기준을 선택할 수 있지만 key 값 생략의 경우, 동일한 컬럼명을 기준으로 join한다.

  • Inner Join: 두 데이터 셋의 중복된 요소만을 join 해줍니다.
  • Outer Join: 두 데이터 셋의 모든 요소를 join 해줍니다.
  • Left Join: 두 데이터 셋 중 왼쪽 데이터 셋을 기준으로 join 해줍니다.
  • Right Join: 두 데이터 셋 중 오른쪽 데이터 셋을 기준으로 join 해줍니다.

https://datacomy.com/data_analysis/pandas/merge/

df4 = pd.DataFrame({'B': ['B2', 'B3', 'B6', 'B7'],
                    'D': ['D2', 'D3', 'D6', 'D7'],
                    'F': ['F2', 'F3', 'F6', 'F7']}, 
                   index=[2, 3, 6, 7])

df1
df4

pd.concat([df1, df4], axis=1, join='outer') # default : outer join (합집합)
pd.concat([df1, df4], axis=1, join='inner') # inner join (교집합)
pd.concat([df1, df4], axis=1).reindex(df1.index) # left join
pd.concat([df1, df4], axis=1).reindex(df4.index) # right join

outer(default)
inner
left
right

merge()

left = pd.DataFrame({'key': ['K0', 'K4', 'K2', 'K3'],
                     'A': ['A0', 'A4', 'A2', 'A3'],
                     'B': ['B0', 'B4', 'B2', 'B3']})

right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
                      'C': ['C0', 'C1', 'C2', 'C3'],
                      'D': ['D0', 'D1', 'D2', 'D3']})
pd.merge(left, right) # default : how(join) = inner  
pd.merge(left, right, on='key') # default : on = key

pd.merge(left, right, how='outer')
pd.merge(left, right, on='key', how='left')
pd.merge(left, right, on='key', how='right')

inner(default)
outer

 

'DATA ANALYSIS > TIL' 카테고리의 다른 글

[Day22] 데이터 핸들링(5)  (0) 2023.05.27
[Day21] 데이터 핸들링(4)  (0) 2023.05.25
[Day19] 데이터 핸들링(2)  (0) 2023.05.24
[Day18] 데이터 핸들링(1)  (0) 2023.05.23
[Day 17] Python 심화(7)  (0) 2023.05.18