Pandas DataFrame 만들고 고치기

Pandas란?

데이터프레임과 시리즈라는 자료형과 데이터 분석을 위한 다양한 기능을 제공하는 파이썬 라이브러리입니다.

DataFrame이란?

  • 가로축과 세로축이 있는 엑셀과 유사한 데이터구조입니다.
  • 가로축은 로우(행), 세로축은 컬럼(열)이라고 합니다.
  • 데이터프레임은 시리즈의 결합체입니다.

DataFrame 만들기

DataFrame 불러오기

# 수동으로 직접 데이터 프레인 만들기
import pandas as pd

commanders = pd.DataFrame({
    'Nation': ['조선', '신라'],
    'Origin': ['아산', '진천'],
    'Age':[53, 78]},
    index =  ['이순신', '김유신'],
    columns = ['Age', 'Nation', 'Origin']
)

# 리스트나 시리즈로 데이터프레임 만들기
a = ['100', '95', '80']
df = pd.DataFrame(a)
df.columns = ['국어', '영어', '수학']
# pandas 라이브러리 호출
import pandas as pd

# 탭으로 구분되는 CSV 불러오기
df = pandas.read_csv('../data/gapminder.tsv', sep='\t')

# excel 불러오기
df = pd.read_excel('result1.xlsx')

DataFrame 확인하기

# 데이터프레임의 행과 열의 갯수 확인하기
print(df.shape)
print(df.shape[0]) #행의 갯수
print(df.shape[1]) #열의 갯수

# 데이터프레임의 컬럼 확인하기
df.columns

# 데이터프레임의 자료형 확인하기
## 데이터프레임에서는 파이썬과 자료형이 약간 다름, str -> object, int -> int64, float -> float64
df.dtypes

# 데이터프레임의 종합정보 확인하기
df.info()

# 인덱스 확인
df.keys().  # 메서드
df.keys()[0]   # 인덱스 위치 확인

df.index    # 속성 
df.index[0]    # 인덱스 위치 확인

# 함수, 속성 확인
dir(df)

# 열의 타입 확인
df['age'].dtype

DataFrame column 쪼개기

# 열단위로 쪼개기
a = df['column_name']
type(a) # a의 자료형은 Series

# DataFrame의 일부 열로 다시 DataFrame 만들기
b = df[['column_name1', 'column_name2', 'column_name3']] # 컬럼이름들로 대괄호를 두번 감싸야 함
type(b) # b의 자료형은 DataFrame

DataFrame row 쪼개기

# 행단위로 쪼개기 (loc)
## # loc 속성에 대괄호를 사용하여 인덱스(행 이름)를 전달하면 행 데이터를 추출할 수 있음
c = df.loc[0] 
c = df.loc[-1] # 이렇게 하면 오류가 난다. 대괄호 안에 입력하는 값는 DataFrame의 인덱스값임

# 1, 100, 1000번째 행의 데이터 추출
df.loc[[0, 99, 999]] # 대괄호를 두번 감싸야 함

# 행단위로 쪼개기 (iloc)
## # iloc 속성에 대괄호를 사용하여 행 번호(행 위치)를 전달하면 행 데이터를 추출할 수 있음
c = df.iloc[0] 
c = df.iloc[-1] # 이렇게 해도 된다.

# 1, 100, 1000번째 행의 데이터 추출
df.iloc[[0, 99, 999]] # 대괄호를 두번 감싸야 함

DataFrame row-column 일부 쪼개기

# loc를 사용하기
subset = df.loc[:, ['year', 'pop']] #행, 열
#subset = df.iloc[:, ['year', 'pop']] #오류
subset2 = df.loc[[0,99,999], ['country', 'lifeExp', 'gdpPercap']] # 0, 99, 999행의 country,lifeExp, gdpPercap열 데이터 추출
tesla.loc[(tesla.Date.dt.year == 2010) & (tesla.Date.dt.month == 6)] # & 조건, datetime의 dt 조건은 bool

# iloc를 사용하기
subset2 = df.iloc[:, [2, 4, -1]] #행, 열
#subset2 = df.loc[:, [2, 4, -1]] #오류
subset3 = df.iloc[:, 0:6:2] # list(range(0,6,2))와 동일
subset4 = df.iloc[[0, 99, 999], [0, 3, 5]] # 0, 99, 999행의 0, 3, 5번째 열 데이터 추출

# 불린 추출
subset5 = df[df['age'] > df['age'].mean()] # df의 age 열의 평균값보다 큰 아이를 추출

첫 행을 필드명으로

df.rename(columns=df.iloc[0], inplace=True)
df.drop([0], inplace=True)

행을 추가하고 하나의 값을 일괄 입력하기

df1['date'] = formatted_yesterday     # 이렇게 하면 워닝 뜸
df1.loc[:, 'date'] = formatted_yesterday

중복제거 유니크값 확인

df['age'].unique()

DataFrame Groupby

result1 = df.groupby('group_field')['target_field'].mean()
result2 = df.groupby(['group_field1', 'group_field1'])[['target_field1', 'target_field2']].mean()

# groupby를 하면 group_field로 인덱스가 잡힘

flat = result.reset_index() # 기본 결과의 인덱스 계층 구조를 없애고 평탄화

# groupby 함수 예제
df.groupby('a')['b'].mean() # 평균
df.groupby('a')['b'].nunique() # 중복제거한 갯수
df.groupby('a')['b'].value_counts() # 빈도수
df.groupby('a')['b'].min() # 최소값
df.groupby('a')['b'].max() # 최대값

DataFrame 복제

b = a.copy()
b = a[:]

DataFrame 수정

# 컬럼명 수정
df.rename(columns = {'old_nm' : 'new_nm'}, inplace = True)
df.rename(columns={df.columns[0] : 'new_nm'}, inplace=True)
df.columns = ['new_nm1', 'new_nm2']

값 일괄 수정

# loc 사용
df.loc[df['age']>150, ['age']] = np.nan

# 딕셔너리 사용
dic_y = {'class1':0, 'class2':1}
df8['target'] = df8['target'].replace(dic_y)

one-hot-encoding

df9['target'] = df9['target'].astype(str)
df10 = pd.get_dummies(df9['target'])

결측치 확인 삭제

df.isnull().sum()
df2 = df.dropna(axis=0) # 결측치가 하나라도 있는 행들을 삭제한다.
df3 = df.dropna(axis=1) # 결측치가 하나라도 있는 열들을 삭제한다.
df4 = df.dropna(how='all') # 행의 모든 값이 결측치라면 삭제
df5 = df.dropna(thresh=2) # 값이 2개 미만이면 삭제
df6 = df.dropna(subset =['gender']) # 특정 열에 결측치가 있는 행 삭제

결측치 대체

alter_values = 'age':0, 'gender':'U'
df7 = df.fillna(value=alter_values)

DataFrame 행/열 삭제

#예제 : 행 혹은 열을 삭제하는 법
#axis=0 행, axis=1 열을 의미
df_dropped = df.drop(['Age'], axis=1)
df.drop([0], inplace=True) # 행 삭제, 디폴트는 axis=0

#  삭제
del df['target_row']

DataFrame 병합

# Merge 사용
data_result = pd.merge(df1, df2, on='공통컬럼') # inner 조인

DataFrame 인덱스 설정

df.set_index('target_index_column', inplace=True)

DataFrame 기초 통계

df['age'].mean()
df['age'].min()
df['age'].max()
df['age'].std()

df['age'].describe()

# 평균 나이보다 나이가 많은 사람을 추출(**)
ages = df['age']
print(ages[ages > ages.mean()])
# 많이 하는 실수
print(ages > ages.mean())

DataFrame 정렬

df.sort_index(ascending=False) # 인덱스 기준으로 정렬되지만 그 상태가 데이터프레임에 저장되지 않음
df.sort_index(ascending=False, inplace = True) # 인덱스 기준으로 정렬되고 그 상태로 저장
df.sort_index(ascending = False).reset_index() # 인덱스 기준으로 정렬되고 그 상태로 인덱스가 index 라는 필드로 튀어 나오고 0부터 시작하는 정수로 새로운 인덱스 부여

df.sort_values(by='Age', ascending=False) # 'Age' 필드가 정렬되지만 그 상태가 데이터프레임에 저장되지 않음
df.sort_values(by='Age', ascending=False, inplace = True) # 'Age' 필드가 정렬되고 그 상태로 저장
df.sort_index(ascending = False).reset_index() # 정렬되고 그 상태로 인덱스가 index 라는 필드로 튀어 나오고 

DataFrame 연산

df * 2 # 문자열은 2번 반복되고, 정수는 2가 곱해짐

DataFrame의 일반 형변환

df['매출'] = df['매출'].astype(int)

DataFrame의 Datetime 형변환

df2 = pd.to_datetime(df['Born'], format='%Y-%m-%d')

DataFrame 저장

# 피클로 저장
df.to_pickle('filename')

# 피클 불러오기
import pandas as pd
pd.read_pickle('filename')

# CSV 인덱스가 붙은 예제
df.to_csv('filename')
df.to_csv('filename', sep='\t') # 탭으로 구분한 파일

# 시리즈를 저장하는 경우
df = series.to_frame()

# 만약 엑셀저장이 안되는 경우
import openpyxl
df.to_excel('filename', engine='openpyxl')

DataFrame의 그래프 표현

# 한글처리를 위한 스크립트
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc
plt.rcParams['axes.unicode_minus'] = False # -표시 깨짐 방지
f_path="/Library/Fonts/Arial Unicode.ttf" # for mac
#f_path = "C:/Windows/Fonts/malgun.ttf" # for windows
font_name = font_manager.FontProperties(fname=f_path).get_name()
rc('font', family=font_name)

import warnings
warnings.filterwarnings(action='ignore')

Leave a Comment