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
- 데이터를 그룹별로 변환
-
split: 원본 데이터에서 분류하고자하는 데이터를 나눠준다
-
apply: 분류된 데이터(그룹별)에 함수 적용
-
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])


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




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')


'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 |