Data Science/Pandas & Numpy&Scikit-learn
[Pandas] Pandas를 통한 데이터 전처리
상어군
2022. 9. 13. 23:15
반응형
1. Pandas 인스톨 및 import
pip install pandas
import pandas as pd
# as pd의 의미는 앞으로 pandas를 pd라는 약자로 부르겠다
2. 데이터프레임 생성
2.1 파일로부터 데이터프레임 생성
df = pd.read_csv("파일위치/파일이름.csv")
인자이름 | 기본값 | 변경가능값 | 의미 |
sep | ',' | 구분자로 사용할 문자열 | 컬럼간 구분자 csv의 구분자인 ','가 기본값이다 |
header | 'infer' | None | 파일에 항목이름(column)이 없을경우 None으로 설정 |
names | 없음 | 항목이름 리스트 | 읽어오는 데이터의 항목이름 설정 |
usecols | None | 항목이름 리스트 | 지정된 항목만 읽어옴 |
df = pd.read_csv('myfile.txt', header=None, delimiter='\t', names=['id','name','score'])
# myfile.txt를 읽어온다
# header는 없다
# 구분자는 '\t'으로 한다
# 데이터 항목 이름은 id, name, score으로 한다
2.2 딕셔너리로부터 데이터프레임 생성
dic = {
"name": ["Kim", "Lee", "Youn"],
"age": [26, 45, 20],
"car": [True, False, False]
}
df = pd.DataFrame(dic)
2.3 리스트로부터 데이터프레임 생성
lst = [[ "Kim", 26, True ],
["Lee", 45, False],
["Youn", 20, False]]
titles = ['name', 'age', 'car']
df = pd.DataFrame(lst, columns=titles)
3. 데이터프레임 정보 확인하기
# 더미데이터
dic = {
"name": ["Kim", "Lee", "Youn", "Hong", "Kang"],
"age": [26, 45, 20, None, 37],
"car": [True, False, False, True, False],
"family": [2,3,4,4,3]
}
df = pd.DataFrame(dic)
3.1 info
df.info()
#Range Index : 5 entries, 0 to 4 => 5개의 행이 있으며 인덱스는 0부터 4이다
#Data columns (total 4 columns) => 데이터 열(컬럼)은 총 4개 있다
#Column => 컬럼 이름
#Non-Null Count => Nan이 아닌 값의 수
#Dtype => 데이터 타입 종류
3.2 describe
df.describe()
3.3 Count
주어진 데이터프레임의 전체 또는 특정 열에 대해서 개수 반환
df.value_counts()
df['car'].value_counts()
3.4 Unique
df['car'].unique()
4. 정렬
df.sort_values(by='age',ascending=False)
# age 컬럼을 기준으로 정렬
# ascending=False는 내림차순을 의미(True는 오름차순)
df.sort_index(ascending=False)
# 인덱스를 기준으로 정렬
df.sort_index(axis=1)
# axis=1이기 때문에 좌측의 인덱스가 아닌 컬럼기준 정렬
5. 데이터 행/열 선택
5.1 열 선택
# 여러방법을 통해서 불러올 수 있다
df['name']
df.name
df.loc[:,'name']
# 다중 열 선택
df[['name','age']]
df.loc[:,['name','age']]
5.2 행 선택
# 하나의 행만 불러오기
df.name[0]
# 인덱스 1~3 불러오기
df.loc[1:3,['name','age']]
# 인덱스 2부터 끝까지 불러오기
df.loc[2:,['name','age']]
데이터 행/열 선택에서 다중조건을 적용하는 심화과정은 아래의 포스팅 참고
[Python]다중 조건으로 데이터 프레임 특정 행 추출하기(데이터 프레임 필터링)
6. 열 생성/삭제
6.1 열 생성
6.2 열 삭제
df = df.drop(['name','total'],axis=1)
7. 중복 확인/제거
7.1 중복 확인
중복값이 존재하는 행에 대해서 True 반환
# 데이터 생성
dic = {
"name": ["Kim", "Lee", "Youn", "Lee", "Kim"],
"year": [2014, 2015, 2016, 2015, 2014],
"points": [1.5, 1.7, 3.6, 2.4, 1.5]
}
df = pd.DataFrame(dic)
# 전체 행의 중복 확인
df.duplicated()
# year 컬럼의 중복 확인
df.duplicated(["year"])
df.duplicated(["year"],keep=False)
# keep 인자의 기본값은 First
# first : 후에 나타난 값을 중복으로 취급
# last : 먼저 나타난 값을 중복으로 취급
# False : 둘다 중복으로 취급
7.2 중복 삭제
# 한개의 컬럼(name)이 중복일 경우 삭제
df2 = df.drop_duplicates(["name"],keep='last')
# 두개의 컬럼(name, points) 모두 중복일 경우 삭제
df3 = df.drop_duplicates(["name","points"],keep='last')
8. 결측치
8.1 결측치 찾기
# 데이터 생성
dic = {
"name": ["Kim", "Lee", "Youn", None, "Kim"],
"year": [2014, 2015, 2016, None, None],
"points": [1.5, 1.7, 3.6, 2.4, 1.5]
}
df = pd.DataFrame(dic)
# Nan의 위치 T/F로 반환
print(df.isnull())
# 각 컬럼별 Nan 개수 반환
print(df.isnull().sum())
8.2 결측치 제거
print(df)
# Nan이 포함된 모든 행 삭제
df2 = df.dropna()
print(df2)
# name 컬럼에 Nan이 있는 행 삭제
df3 = df.dropna(subset=['name'])
df3
thresh라는 파라미터를 통해서 관측값이 n개 미만일 경우에 삭제 하는 조건을 걸 수 있다.
dic = {
"name": ["Kim", "Lee", "Youn", "Kim"],
"year": [2014, 2015, 2016, None],
"points": [1.5, 1.7, None, None]
}
df = pd.DataFrame(dic)
df3 = df.dropna(thresh=2)
df3
8.3 결측치 치환
# 데이터 생성
dic = {
"name": ["Kim", "Lee", "Youn", None, "Kim"],
"year": [2014, 2015, 2016, None, 2018],
"points": [1.5, 1.7, 3.6, 2.4, 1.5]
}
df = pd.DataFrame(dic)
print(df)
# 모든 Nan을 0으로 치환
df2 = df.fillna(0)
print(df2)
# year 컬럼의 Nan값을 year컬럼의 평균으로 치환
import numpy as np
df3 = df.copy()
df3['year'] = df3['year'].fillna(np.mean(df['year']))
print(df3)
# year 컬럼의 Nan값을 이전행의 값으로 치환
df4 = df.copy()
df4['year'] = df4['year'].ffill()
print(df4)
# year 컬럼의 Nan값을 이후행의 값으로 치환
df5 = df.copy()
df5['year'] = df5['year'].bfill()
print(df5)
# year 컬럼의 Nan값을 이전 이후행의 사잇값으로 치환
df6 = df.copy()
df6['year'] = df6['year'].interpolate()
print(df6)
9. Gourpby
특정 컬럼에 대해서 같은 값을 가지는 행끼리 묶어주는 메서드(함수)
dic = {
"name": ["Kim", "Lee", "Youn", "Lee", "Kim"],
"year": [2014, 2015, 2016, 2015, 2014],
"points": [1.5, 1.7, 3.6, 2.4, 1.5],
"dept" : ["CSE", "EE", "CSE", "CSE", "EE"]
}
df = pd.DataFrame(dic)
print(df)
# 각 그룹에 대해서 통계치를 반환
df[['year','points','dept']].groupby('dept').agg(['count','mean','max','min'])
# groupby를 for문에서 받을 경우
for x in df.groupby('dept'):
print("x[0]은 : ",x[0])
print("x[1]은 :\n",x[1])
break
반응형