📍 axis : 축을 행 또는 열로 결정 ➡️ 0 또는 'index'이면 누락된 값이 포함된 행을 삭제 ➡️ 1 또는 'columns'이면 누락된 값이 포함된 열을 삭제 ➡️ 기본값은 0 📍 how : any는 null 값이 있는 경우 행 또는 열을 삭제 all은 모든 값이 누락된 경우 행 또는 열을 삭제 기본값은 any 📍 inplace : 데이터프레임에 나온 값을 저장할 것인지를 설정하는 변수로 기본적으로 값은 False
# 결측 데이터가 있는 행 삭제 후 확인
df2 = df.dropna() # 옵션을 지정하지 않아서 행기준, NaN가 하나라도 있는 경우에 삭제.
df2.isnull().sum()
'''
temp 0
max_wind 0
mean_wind 0
dtype: int64
'''
# 원본 데이터는 변경 x
df.isnull().sum()
'''
temp 0
max_wind 4
mean_wind 6
dtype: int64
'''
3) 결측 데이터 대체
✏️ fillna() : 결측 데이터를 특정 값으로 채움. inplace를 True로 설정해 원본 데이터를 수정
# 결측 데이터 대체하기 : 평균값으로 대체
df['max_wind'].fillna(df['max_wind'].mean(), inplace=True)
df['mean_wind'].fillna(df['mean_wind'].mean(), inplace=True)
# 결측 데이터 대체 후 확인
df.isna().sum()
'''
temp 0
max_wind 0
mean_wind 0
dtype: int64
'''
🚀 file_name은 텍스트 파일 이름으로 경로를 포함할 수 있음 🚀 선택사항인 options에는 구분자와 문자의 인코딩 방식 등을 지정
⚡️ 지정하지 않으면 구분자는 콤마가 되고, 문자의 인코딩 방식은 'utf-8'이 됨
# 네 명의 몸무게 Weight와 키 Height 데이터를 DataFrame 형식으로 생성.
df_WH = pd.DataFrame({'Weight': [62, 67, 55, 74],
'Height': [165, 177, 160, 180]},
index=['ID_1', 'ID_2', 'ID_3', 'ID_4'])
df_WH
📌 데이터 개수 n=3653 entry, 행 인덱스 번호 0 to 3652 📌 열 변수 출력 형식 : 실수 float, 문자열 object 📌 결측치 개수가 나타남 : max_wind, mean_wind 변수에 결측치가 있음 (= 값이 없는 칸이 존재 )
4) df.head() / df.tail()
👾 데이터를 잘 불러 왔는지 확인하기 위해 앞 부분(head)과 마지막 부분(tail)을 확인 👾 head()는 상위 5개 행을 출력하고, tail()은 하위 5개 행을 출력 👾 괄호() 안에 원하는 숫자를 넣으면 그 숫자만큼 행을 출력
# 상위 5행
df.head(5)
출력 결과
# 하위 n행 살펴보기
df.tail()
출력 결과
5) df.index, df.columns
👾 인덱스(행 이름)과 열의 레이블(칼럼 이름)을 출력할 때 사용
# 인덱스 출력
df.index
# 데이터프레임의 인덱스(행 이름)을 반환. 인덱스를 따로 지정하지 않았기 때문에 0부터 시작하는 인덱스가 부여.
# 출력 결과 : RangeIndex(start=0, stop=3653, step=1)
# 컬럼 출력
df.columns
# 출력 결과: Index(['date', 'temp', 'max_wind', 'mean_wind'], dtype='object')
📌 해당 데이터프레임을 구성하는 컬럼명을 확인할 수 있음 📌 컬럼명을 변경할 때도 유용하게 사용
6) df.describe()
👾 데이터의 컬럼별 요약 통계량을 나타냄 👾 mean(), max() 등 개별 함수를 사용하여 통계량을 계산 할 수 있음
# 요약 통계량 확인하기.
df.describe()
출력 결과
7) df.sort_values()
👾 데이터를 크기 순으로 정렬
# 형식
DataFrame.sort_values(by=['정렬변수1', '정렬변수2'...], ascending=True, inplace=False
📌 by=[] : by=을 사용하지 않아도 됨 📌 ascending=True : True가 기본 값이고 오름차순 정렬. 내림차순 정렬일 경우에는 False 사용. 📌 inplace=False : True 이면 정렬 결과가 동일 데이터프레임 이름으로 저장. 기본 값은 False.
# 최대 풍속 max_wind 컬럼의 값의 크기에 따라 오름차순 정렬
df.sort_values(['max_wind'])
출력 결과
# 최대 풍속 max_wind 컬럼의 값의 크기에 따라 내림차순 정렬
df.sort_values(by=['max_wind'], ascending=False)
출력 결과
8) df.value_counts()
👾 범주형 변수의 빈도분석 결과를 출력, 즉 어떤 컬럼의 unique value(고유값)들의 개수를 구함
# 2012년에서 2016년에 걸쳐 계절별로 강수량의 평균(mean)과 표준 편차(std)를 구함.
df3.mean()
'''
봄 254.54
여름 554.24
가을 303.42
겨울 98.66
dtype: float64
'''
df3.std() # 계절별 강수량 표준편차
'''
봄 38.628267
여름 148.888895
가을 67.358496
겨울 30.925523
dtype: float64
'''
📌 연도별로 평균 강수량과 표준 편차를 구할 경우엔 연산의 방향 설정을 위해 axis인자를 추가 📌 인자 axis가 0이면 DataFrame의 values에서 열별로 연산을 수행하고, 1이면 행별로 연산
🍯 표 Table와 2차원 데이터 처리를 위해 DataFrame을 제공 ▶️ 데이터 Data를 담는 틀 Frame이라는 뜻
1) 데이터 생성
df = pd.DataFrame(data [, index = index_data, columns = columns_data])
🐰 data 인자에는 리스트와 형태가 유사한 데이터 타입은 모두 사용 가능 🥕 리스트, 딕셔너리, numpy의 배열 데이터, Series나 DataFrame 타입의 데이터 입력 가능 🐰 세로축 라벨을 index라 하고, 가로축 라벨을 columns 라고 함 🐰 index와 columns를 제외한 부분을 values라고 함
import pandas as pd
d1 = pd.DataFrame([[1,2,3], [4,5,6], [7,8,9]])
d1
d1 결과
🥕 values 부분에는 입력한 data가 순서대로 입력 돼 있고 가장 좌측의 열과 가장 윗줄의 행에는 각각 숫자가 자동으로 생성되어 index, columns를 구성 ▶️ 명시적으로 입력하지 않더라도 자동으로 index, columns가 생성
🍯 pandas 라이브러리 : 파이썬에서 데이터 분석과 처리를 쉽게 처리할 수 있게 도와준다 🍯 pandas는 numpy를 기반으로 만들어졌지만 좀 더 복잡한 데이터 분석에 특화 🍯 numpy가 같은 데이터 타입의 배열만 처리할 수 있는데 반해 pandas는 데이터 타입이 다양하게 섞여 있을 때도 처리 가능
# 어느 가게의 날짜별 판매량을 pandas의 Series 형식으로 입력. 하루는 데이터가 없어서 np.nan을 입력
index_data = ['2018-10-07', '2018-10-08', '2018-10-09', '2018-10-10']
s4 = pd.Series([200, 195, np.nan, 205], index=index_data)
s4
👾 start는 시작날짜, end는 끝날짜 👾 periods는 날짜 데이터 생성 기간 = 생성 갯수 👾 freq는 날짜 데이터 생성 주기 👾 start는 필수이고, end나 periods는 둘 중 하나만 있어도 됨 👾 freq는 입력하지 않으면 'D' 옵션이 설정돼 달력날짜 기준으로 하루씩 증가
# 시작 날짜와 끝 날짜를 지정해 날짜 데이터를 생성. 하루씩 증가한 날짜 데이터가 생성.
pd.date_range(start='2019-01-01', end='2019-01-07')
'''
DatetimeIndex(['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04',
'2019-01-05', '2019-01-06', '2019-01-07'],
dtype='datetime64[ns]', freq='D')
'''
1) 날짜 데이터 형식
🚀 날짜 데이터를 입력할 때 yyyy-mm-dd yyyy/mm/dd, yyyy.mm.dd, mm-dd-yyyy, mm/dd/yyyy, mm.dd.yyyy
# 2일씩 증가하는 날짜를 생성
pd.date_range(start='2019-01-01', periods=4, freq='2D')
# DatetimeIndex(['2019-01-01', '2019-01-03', '2019-01-05', '2019-01-07'],
# dtype='datetime64[ns]', freq='2D')
# 달력의 요일을 기준으로 일주일씩 증가하는 날짜를 생성.
pd.date_range(start='2019-01-06', periods=4, freq='W')
# DatetimeIndex(['2019-01-06', '2019-01-13', '2019-01-20', '2019-01-27'],
# dtype='datetime64[ns]', freq='W-SUN')
# 업무일 기준 2개월 월말 주기로 12개 날짜를 생성.
pd.date_range(start='2019-01-01', periods=12, freq='2BM')
'''
DatetimeIndex(['2019-01-31', '2019-03-29', '2019-05-31', '2019-07-31',
'2019-09-30', '2019-11-29', '2020-01-31', '2020-03-31',
'2020-05-29', '2020-07-31', '2020-09-30', '2020-11-30'],
dtype='datetime64[ns]', freq='2BM'
'''
# 분기 시작일을 기준으로 4개의 날짜를 생성
pd.date_range(start='2019-01-01', periods=4, freq='QS')
# DatetimeIndex(['2019-01-01', '2019-04-01', '2019-07-01', '2019-10-01'],
# dtype='datetime64[ns]', freq='QS-JAN')
[ 시간 생성 ]
# 1시간 주기로 10개의 시간을 생성한 예
pd.date_range(start='2019-01-01 08:00', periods=10, freq='H')
'''
DatetimeIndex(['2019-01-01 08:00:00', '2019-01-01 09:00:00',
'2019-01-01 10:00:00', '2019-01-01 11:00:00',
'2019-01-01 12:00:00', '2019-01-01 13:00:00',
'2019-01-01 14:00:00', '2019-01-01 15:00:00',
'2019-01-01 16:00:00', '2019-01-01 17:00:00'],
dtype='datetime64[ns]', freq='H')
'''
# 업무 시간을 기준으로 1시간 주기로 10개의 시간을 생성하는 예
# 업무 시간은 9시 부터 17시까지이므로 start시간을 9시 이전으로 설정해도 9시 부터 표시.
pd.date_range(start='2019-01-01 08:00', periods=10, freq='BH')
'''
DatetimeIndex(['2019-01-01 09:00:00', '2019-01-01 10:00:00',
'2019-01-01 11:00:00', '2019-01-01 12:00:00',
'2019-01-01 13:00:00', '2019-01-01 14:00:00',
'2019-01-01 15:00:00', '2019-01-01 16:00:00',
'2019-01-02 09:00:00', '2019-01-02 10:00:00'],
dtype='datetime64[ns]', freq='BH')
'''
# date_range()를 이용해 Series의 index를 지정한 예.
index_date = pd.date_range(start='2019-03-01', periods=5, freq='D')
s = pd.Series([51, 62, 55, 49, 58], index=index_date)
s
'''
2019-03-01,51
2019-03-02,62
2019-03-03,55
2019-03-04,49
2019-03-05,58
'''