욱이의 냉철한 공부

[Python] pandas 사용하기 본문

데이터분석/Python : Basic

[Python] pandas 사용하기

냉철한 욱 2022. 3. 28. 07:58

 

 

Series

1. pandas, numpy 라이브러리 추출하기.

import pandas as pd

import numpy as np

 

2. series 만들기, 속성

obj = pd.Series([4,7,-5,3])

obj.values : 시리즈의 값만을 array로 표현

obj.index : 인덱스 값만을 표현

obj.dtypes : int라는 것을 확인

 

-원하는 인덱스 대입할 수 있다.

obj2 = pd.Series([4,7,-5,3],index=["d","b","a","c"])

 

- 딕션어리 형태로도 만들 수 있다.

sdata = {"charles" : 35000, "kilho" : 71000, "hayoung" : 16000, "sangjae":5000}

obj3 = pd.Series(sdata)

 

- 시리즈 자체와 시리즈 인덱스 자체에만 이름 지정 가능

obj3.name = "Salary"

obj3.index.name = "names"

obj3

 

- 인덱스 값 변경

obj3.index = ["A","B","C","D"]

 

3. 인덱싱

obj2['a']

obj2['d']

obj2[['c','a','d']]

obj[[1, 3]]

-

obj2[obj2>0]

obj['b':'c']

obj['b':'c'] = 5

obj2 * 2

np.exp(obj2)

'b' in obj2

'e' in obj2

 

4. null 확인

sdata = {'ohio':35000,'texas':71000,'oregon':16000,'utah':5000}

states = ['clifornia','ohio','oregon','texas']

obj4 = Series(sdata,index=states]

pd.isnull(obj4), obj4.isnull()

pd.notnull(obj4)

 

 


 

dataframe

1. dataframe 의미

시리즈의 집합이다. 각 칼럼은 서로 다른 종류의 값(숫자, 문자열, 불리언)을 담을 수 있다.

=> 인덱스 유무가 array와 리스트와 핵심적인 차이

 

 

2. dataframe 생성 및 기본.

data = {"names" : ["kilho","kilho","kilho","charles","charles","charles"] , "year" : [2014,2015,2016,2015,2016],"points" : [1.5,1.7,3.6,2.4,2.9]}

df = pd.DataFrame(data)

 

df.index : 행

df.columns : 열

df.values : 2차원 array 값으로 표현

df.index.name = "Num"

df.columns.name = "Info"

 

=>

columns는 정확하게 columnsindex이지만, columns라고 부른다.

index는 정확하게 rowindex지만, index라고 부른다.

 

 

df2 = pd.DataFrame(data, columns = ["year","name","points","penalty"], index=["one","two","three","four","five"])

df2.index

df2.columns

df2.values

df2.describe() : 계산 가능한 값들을 자동으로 계산해서 표현

 

df.rename(columns={df.columns[0] : "year"},inplace=True) : 열의 이름을 변경한다.

df.set_index("year",inplace=True) : year열을 인덱스로 사용한다.

 

 

3. 열 호출

data = {"names" : ["kilho","kilho","kilho","charles","charles"], "year":[2014,2015,2016,2015,2016], "points":[1.5,1.7,3.6,2.4,2.9]}

df = pd.DataFrame(data,colums=["year","names","points","penalty"],index=["one","two","three","four","five"])

 

- 1개 열 가져오기

df["year"] : year에 해당하는 값 표현 , index 이름과 함께 표현, 시리즈와 똑같다.

df.year

 

-복수 개의 열 가져오기

df[["year","points"]] : 중괄호를 두번 쓴다.

 

- 열 생성

df["penalty"] = 0.5

df["penalty"] = [0.1 ,0.2,0.3,0.4,0.5]

df[df < 5] = 0 : 전체

df["zeros"] = np.arange(5)

 

val = pd.Series([-1.2,-1.5,-1.7), index=["two","four","five"])

df["debt"]=val

 

df["new_points"] = df["points"] - df["penalty"]

df["high_points"] = df["net_points"]>2.0

 

- 열 삭제

del df["high_points"]

del df["net_points"]

del df["zeros"]

df

 

- 확인

df.columns : 보고 확인한다.

df.index.name = "order"

df.columns.name = "Info"

 

 

4. 행을 선택하고 조작하는 방법 : 인덱싱 및 슬라이싱

=>행을 인덱싱하는 방법 무수히 많다 .

df[0:3]

df["two":"four"]

=> 열하고 헷갈린다. 그래서 비추한다.

 

- loc사용 : loc : label에 대한 슬레이싱은 마지막 설정값도 범주에 포함시킨다.

df.loc["two"] : 인덱스가 two인 값의 행의 모든 값을 모두 가져온다.

df.loc["two":"four"]

 

df.loc["two":"four","points"]

df.loc[:,"year"]

df.loc[:,["year","names"]]

df.loc["three":"five","year":"penalty"]

df.loc["six",:] = [2013,"Hayoung",4.0,0.1,2.1]

 

- iloc 사용 : 값이 location이기 때문에 마지막 설정값을 포함하지 않는다.

df.iloc[3]

df.iloc[3:5,0:2] : 5하고 2에 해당하는 값 포함시키지 않는다. 이 숫자는 label이 아닌 location 값

df.iloc[[0,1,2],[1,2]]

df.iloc[:,1:4]

df.iloc[1,1]

 

- ix 사용 : 문자와 숫자 전부 활용.

data = DataFrame(np.arange(16).reshape((4, 4)), index=['Ohio', 'Colorado', 'Utah', 'New York'], columns=['one', 'two', 'three', 'four'])

 

data.ix['Colorado', ['two', 'three']]

data.ix[['Colorado', 'Utah'], [3, 0, 1]]

data.ix[2]

data.ix[data.three > 5, :3]

 

- 불리언 인덱싱 - 마스크

df["year"] > 2014

df.loc[df["year"]>2014,;]

df.loc[df["names"] == "kilho",["names","points"]]

df.loc[(df["points"]>2) &(df["points"]<3),:]

df.loc[ df["points"]>3, "penalty" ] = 0

 

- 3가지 비교

data.ix[['Colorado','Utah'],[3,0,1]]

data.loc['Colorado':'Utah',['four','one','two']]

data.iloc[1:3,[3,0,1]]

 

data.ix[data.three>5,:3]

data[data.three>5].iloc[:,:3]

data[data.three>5].loc[:,'one':'three']

 

 

5. reindexing

1. 0을 채운다.

obj = Series([4.5, 7.2, -5.3, 3.6], index=['d', 'b', 'a', 'c'])

obj2 = obj.reindex(['a', 'b', 'c', 'd', 'e'])

obj.reindex(['a', 'b', 'c', 'd', 'e'], fill_value=0)

 

2. 앞의 값을 채운다.

obj3 = Series(['blue', 'purple', 'yellow'], index=[0, 2, 4])

obj3.reindex(range(6), method='ffill')

 

3. row 재색인

frame = DataFrame(np.arange(9).reshape((3, 3)), index=['a', 'c', 'd'], columns=['Ohio', 'Texas', 'California'])

frame2 = frame.reindex(['a', 'b', 'c', 'd'])

 

4. columns 사용

states = ['Texas', 'Utah', 'California']

frame.reindex(columns=states)

 

 

 

6. 결측치값 및 이상치 조정

df = pd.DataFrame(np.random.randn(6,4))

df.coloumns = ["A","B","C","D"]

 

df.index = pd.data_range("20160701",periods=6) : 데이터타임 형태 인덱스 중요 , 시계열에 사용 가능

 

df["F"] = [1.0,np.nan,3.5,6.1,np.nan,7.0] : F열 새롭게 정의,np.nan 인위적으로 포함 시키도록 할때

 

df.dropna(how="any") : nan가 포함된 행 제거

 

df.dropna(how="all") : 한 행의 모든 값이 nan일 경우 삭제

 

df.fillna(value = 5.0) : nan 대신 5.0 대입

 

df.isnull()

df.loc[df.isnull()["F"],:]

 

- 특정 행, 열 삭제

Series

obj = Series(np.arange(5.), index=['a', 'b', 'c', 'd', 'e'])

obj.drop('c')

obj.drop(['d', 'c'])

 

data = DataFrame(np.arange(16).reshape((4, 4)), index=['Ohio', 'Colorado', 'Utah', 'New York'], columns=['one', 'two', 'three', 'four'])

 

data.drop(['Colorado', 'Ohio'])

data.drop('two', axis=1) : 열 삭제, del로도 가능

data.drop(['two', 'four'], axis=1)

 

*다른 예

df.drop([26],inplace = True) : 26번행 제거

del df["열 이름"] : 열 이름 제거

 

 

 

 

7. 기술통계(통계함수, 분석함수)사용

data = [[1.4,np.nan],[7.1,-4.5],[np.nan,np.nan],[0.75,-1.3]]

df = pd.DataFrame(data,columns=["one","two"],index=["a","b","c","d"])

 

- 행, 열 계산

df.sum(axis=0) : 행방향 합을 구한다, 각 열의 합 산출

df.sum(axis=1) : 열방향 합을 구한다. 각 행의 합 산출

=> nan 배제하고 계산한다.

 

- 특정 열, 특정 열만 계산

df["one"].sum() : one이라는 열만 계산

df.loc["b"].sum() : b라는 행만 계산

 

- nan 감안해서 계산

df.mean(axis=1,skipna=False)

 

- NaN에 그 열의 평균값, NaN 그 열의 최소값 넣는다.

one_mean = df.mean(axis=0)["one"]

two_min = df.min(axis=0)["two"]

 

df["one"] = df["one"].fillna

df["one"] = df["one"].fillna(value=one_mean) : 전체로 사용하지 않을 것

df["two"] = df["two"].fillna(value=two_mean)

 

- 상관계수, 공분산

df2 = pd.DataFrame(np.random.rand(6.4), columns ["A","B","C","D"],index=pd.data_range("20160701",periods=6))

df2["A"],corr(df2["B"])

df2["B"].cov(df2["C"])

df2.corr() : 모든 열에 관해서 알아서 계산

df2.cov()

 

 

 

8. 정렬함수

인덱스 기준

dates=df2.index

random_dates = np.random.permutation(dates)

df2 = df2.reindex(index=random_dates,columns=["D","B","C","A"])

 

- 인덱스 오름차순

df2.sort_index(axis=0) : 인덱스 기준, 행방향

df2.sort_index(axis=1) : 칼럼기준, 열방향

 

- 인덱스 내림차순

df2.sort_index(axis=0,ascending = False)

df2.sort_index(axis=1,ascending = True)

 

- 값 기준

df2.sort_values(by="D")

df2.sort_values(by="B")

 

- 동시에 값 기준

df2["E"] = np.random.randint(0,6,size=6)

df2["F"] = ["alpha","beta","gamma","gamma","alpha","gamma"]

df2.sort_values(by=("E","F"])

 

 

 

 

9. 순위함수

obj = Series([7, -5, 7, 4, 2, 0, 4])

obj.rank()

obj.rank(method='first')

obj.rank(ascending=False, method='max')

 

frame = DataFrame({'b': [4.3, 7, -3, 2], 'a': [0, 1, 0, 1], 'c': [-2, 5, 8, -2.5]})

frame.rank(axis=1)

 

 

 

 

10. 유일 값, 값 세기,포함 여부

df2["F"].unique() : 유일값

df2["F"].value_counts() : 값 세기

df2["F"].isin(["alpha","beta"]) : 포함 여부

df2.loc[df2["F].isin(["alpha","beta"]),:] : 포함 여부 응용

 

 

 

 

 

11. 사용자가 직접 정의한 함수 적용

df3 = pd.DataFrame(np.random.randn(4,3),columns=["b","d","e"],index=["Seoul","Incheon","Busan","Daegu"])

 

func = lambda x: x.max() - x.min()

 

df3.apply(func, axis=0) : 각 열의 최대에서 최소 값 뺀 값 도출

df3.apply(func, axis=1) : 각 행의 최대에서 최소 값 뺀 값 도출

 

 

 

 

 

12. 누락된 데이터 처리

=> NA처리 메서드 - dropna, fillna, isnull, notnull

 

1. isnull

string_data = Series(['aardvark', 'artichoke', np.nan, 'avocado'])

string_data.isnull()

string_data[0] = None

 

2. dropna - how, axis 인자

from numpy import nan as NA

data = Series([1, NA, 3.5, NA, 7])

data.dropna()

data[data.notnull()]

data.dropna(how='all')

data.dropna(axis=1, how='all')

 

3. dropna - thresh 인자

df = DataFrame(np.random.randn(7, 3))

df.ix[:4, 1] = NA; df.ix[:2, 2] = NA

df.dropna(thresh=3) : 몇 개 이상의 값이 들어있는 로우만 살펴보기.

 

4. fillna

인자 : value, method, axis, inplace, limit

df.fillna(0) : 비어 있는 곳에 0 대입

df.fillna({1:0.5,3:-1}) : 사전 값을 넘겨서 각 칼럼마다 다른 값 대입

df.fillna(method='ffill') : 열의 끝 자리 값을 그대로 대입

df.fillna(method='ffill', limit=2) : 열의 끝 자리 값을 2개 까지만 대입

 

data = Series([1., NA, 3.5, NA, 7])

data.fillna(data.mean()) : 비어 있는 곳에 평균 값 대입