pd.Series(['코기', '허스키', '푸들'])
0 코기
1 허스키
2 푸들
dtype: object
city_names = pd.Series(['서울', '부산', '대전'])
population = pd.Series([9776000, 3429000, 1531000])
pd.DataFrame({'도시': city_names, '인구':population})
도시 인구
0 서울 9776000
1 부산 3429000
2 대전 1531000
csv파일을 읽어옴
DataFrame에 관한 통계값을 보여줌
처음 5개 데이터레코드 미리보기가 가능
indexing 을 통해 한 column 에 접근하면 series
cities = pd.DataFrame({'도시': city_names, '인구':population})
print(type(cities['도시']))
cities['도시']
<class 'pandas.core.series.Series'>
0 서울
1 부산
2 대전
Name: 도시, dtype: object
series 에서 또 한번 indexing 하면 string
print(type(cities['도시'][1]))
cities['도시'][1]
<class 'str'>
부산
슬라이싱도 가능하다.
print(type(cities[0:2]))
cities[0:2]
<class 'pandas.core.frame.DataFrame'>
도시 인구
0 서울 9776000
1 부산 3429000
데이터를 분석에 용이하게 다듬는 과정 (=data cleansing)
결측치
이상치 (outlier)
변수의 수 - 너무 많은 경우 차원 축소 (PCA)
편향된 분포의 변수 - log, sqrt 등 으로 분포 변환
측정 단위(scale)이 차이가 클 경우 - 스케일링
# 결측치 갯수 확인
df.isnull().sum()
포맷 통일
# 날짜가 String인 경우
df['datetime'] = pd.to_datetime(df['datetime'])
# 날짜 포맷이 다를 경우
pd.Series(pd.to_datetime(['2021/08/01', '2021.08.02', '2021.3.3']))
결측치 처리
# 결측치가 하나라도 있으면 버림
df.dropna()
# 모든 값이 Null일 경우만 버림
df.dropna(how='all')
# 결측치가 하나 이상 있는 데이터만 선택
df[df.isnull().any(axis=1)]
# Null 값을 mean으로 대체
df.fillna(df.mean())
# Null 값을 mode로 대체
df.fillna(df.mode())
샘플수가 충분하지 않을 경우, Pandas의 fillna() 명령어로 Null 값을 채우는 것이 가능하다.
텍스트 통일
food_data = StringIO("""
seq,name,price,date
1,초밥,"10",2021-01-01
2,냉면,,2021-01-02
3,스시,"8",2021-01-03
4,짜장면,"7",2021-01-04
5,,"7",2021-01-05
6,자장면,,2021-01-06
7,돈까스,"7",
8,초밥,"8",2021-01-08
9,초밥,,2021-01-09
""")
df = pd.read_csv(food_data, dtype={"seq": pd.Int64Dtype()}, parse_dates=[3])
df
딕셔너리 이용해서 replace
food_dic = {'자장면': '짜장면',
'스시': '초밥',
'돈가츠': '돈까스'}
df['name'] = df['name'].replace(food_dic)
df
na 값 최빈값으로 채우기
df['name'] = df['name'].fillna(df['name'].mode()[0])
import statistics
참고 : https://fastcampus.app/courses/205687/clips/428915?organizationProductId=8481