판다스의 apply() 메서드의 기본 문법은 다음과 같다.

 

apply() 메서드는 pandas 객체에 열 혹은 행에 대해 함수를 적용하게 해주는 메서드이다.

 

DataFrame.apply(func,axis=0,raw=False,result_type=None,args=(),**kwds)

 

*func: 이 입력변수는 pandas 객체의 열이나 행에 적용할 함수를 입력받는다.

*axis:함수를 적용할 축을 지정한다.

 -Series에 적용할 경우에는 axis를 따로 지정해주지 않는다.

 -0 or 'index' 

  example) DataFrame.apply(func,axis=0),  DataFrame.apply(func,axis='index')

  :함수를 각 열(columns)에 따라 적용한다.

 -1 or 'index'

  example) 위와 동일

  :함수를 각 행(row)에 따라 적용한다.

*agrs: func에 입력되는 위치 입력변수를 입력받는다. 즉, iterable한 자료형을 입력받는다. (list,tuple등)

*kwds: func에 입력되는 키워드 입력변수를 입력받는다. ->키워드에 입력될 입력값의 mapping을 입력받는다.

 

 

우선 데이터프레임을 간단하게 만들어보자.

 

import pandas as pd
import numpy as np

df=pd.DataFrame([[4,9]]*3,columns=['A','B'])
df

 

df.apply(np.sqrt)

 

위 코드처럼 단순히 apply()메서드에 func를 지정하면 각 Series로 처리가 된다. 즉 Series에서도 셀 당 처리를 해준다.

 

df.apply(np.sum,axis=0)

A    12
B    27
dtype: int64

axis=0으로 지정해 주었을 경우, 위 정의처럼 각 column에 따라 적용한다. 

그러므로, A 와 B column에 대하여 전체 합을 처리해준다.

 

df.apply(np.sum,axis=1)

0    13
1    13
2    13
dtype: int64

axis=1로 지정해 주었을 경우, 위 정의처럼 각 row에 따라 적용한다.

그러므로 index별로 전체 합을 처리해준다.

 

lambda 함수를 적용한 응용 apply()

다음 예를 확인해보자.

 

df.apply(lambda x: [1,2],axis=1)

0    [1, 2]
1    [1, 2]
2    [1, 2]
dtype: object

위 코드를 살펴보면 lambda함수를 사용해 [1,2] 리스트 형식을 axis=1이라는 조건을 통해 각 row에 적용시킨다.

그러면 위 결과와 같이 Series의 결과를 얻게 된다.

 

df.apply(lambda x:[1,2],axis=1,result_type='expand')

위 코드를 살펴보면 lambda함수를 사용해 [1,2]의 리스트를, axis=1이라는 조건을 통해 각 row에 적용 시키는데, 위 예제와 다른점은 result_type='expand' 조건을 추가 적용했다. 

result_type = 'expand'를 전달하면 목록과 유사한 결과가 데이터 프레임의 열로 확장된다.

그러므로 column_name은 0과 1(default)로 지정되고 각 data만 expand(확장)된것을 확인할 수 있다.

 

df.apply(lambda x:pd.Series([1,2],index=['foo','bar']),axis=1)

위 코드를 살펴보면 lambda함수를 통해 각 [1,2]로 되어있는 시리즈를 생성하고, index=['foo','bar']을 지정해준다. 추가로 axis=1을 지정해 줌으로써 각 row에 적용시키는데 위와 같은 결과를 얻을 수 있다.

df.apply(lambda x:[1,2],axis=1,result_type='broadcast')

위 코드를 살펴보면 lambda 함수를 통해 리스트형식인 [1,2]를, axis=1을 지정해줌으로써, 각 row에 삽입해준다.

추가로 result_type = 'broadcast'를 전달하면 함수가 목록 형이든 스칼라이든 상관없이 동일한 모양 결과를 보장하고 축을 따라 브로드 캐스트한다. 결과 열 이름은 원본이된다.

 

*result_type이란 앞서 조건이라고 말했지만 명확히 정의하자면 매개변수(parameter)이다.

{'expand','reduce','broadcast','None'} 종류가 있으며 axis=1 즉, row에만 적용 가능하다. 

'Data analysis > Pandas' 카테고리의 다른 글

[Pandas] DataFrame  (0) 2021.01.15
[Pandas] Series  (0) 2021.01.15
[Pandas] DataFrame 특정 칼럼 혹은 인덱스 선택  (0) 2021.01.13
[Pandas] DataFrame(개념)  (0) 2021.01.13

이전 포스팅에서 판다스 자료구조인 Series에 대해 알아보았다. 이번에는 DataFrame(데이터프레임)에 대해 알아보자.

시리즈가 엑셀의 한 열과 동일한 이해구조를 본다면, 데이터프레임은 그 열을 merge한 엑셀 시트라고 볼 수 있다.

컴퓨터 공학도에게는 DB를 알기에 데이터베이스와 동일하다고도 볼 수 있다.

 

DataFrame의 정의:

DataFrame(데이터프레임)은 numpy의 ndArray를 기반으로 한 행과 열로 이루어진 자료구조이다.

 

판다스 데이터프레임 속성은 다음과 같다.

 

https://dsbook.tistory.com/12

 

데이터프레임 생성법부터 알아보자.

생성법은 크게 3가지가 있다. list를 이용한 생성, Dictionary를 이용한 생성, Series를 이용한 생성

각각 한번 알아보자.

list를 이용한 생성법.

이 list생성도 두가지로 분류 할 수 있다. 1자원 리스트와 멀티 리스트로 볼 수 있다.

-1차원 리스트

single_list=['a','b,','c','d']
df=pd.DataFrame(single_list)
df


	0
0	a
1	b
2	c
3	d

본인도 데이터를 다루며 이런식의 데이터프레임은 잘 사용하지 않으므로 설명은 생략하겠다.

-멀티 리스트

multi_list=[['kwandoll',27],['suuuuuk',27],['heeeee',30]]
df=pd.DataFrame(multi_list)
df


0	1
0	kwandoll 27
1	suuuuuk	27
2	heeeee	30

위 리스트를 이용한 생성을 보면 칼럼들에 대한 변수명은 0 과 1이다. 만일 dimension을 늘리면 늘릴수록 칼럼명은 0,1,2,3,4~~~식으로 간다는 건데, 일반적으로 이해하는게 어렵다.

 

그렇기에, 카럼명을 지정해줘야 한다.

multi_list=[[['kwandoll',27],['suuuuuk',27]],[['heeeee',30]]]
df=pd.DataFrame(multi_list,columns=['name','age'])
df


name	age
0	kwandoll 27
1	suuuuuk	27
2	heeeee	30

이러한 작업을 피하기 위해, 본인은 파이썬에 꽃인 Dictionary자료구조를 제일 많이 사용한다. 실제 데이터 분석을 할경우 같은 의미를 뽑아야하는 경우가 있으며, 데이터프레임 내에 처리가 안될 경우에는 value들을 직접 뽑아서 처리하고 DataFrame에 다시 저장하는 경우가 비일비재하다. 그러므로 이번에 설명하는 Dictionary를 이용한 생성을 유심히 보길 바란다.

 

Dictionary를 이용한 생성

딕셔너리 자료구조로 생성할때 두가지가 있다. 단순 Dictionary로 생성하기, Dictionary로 구성된 리스트로 생성하기.

우선 단순 Dictionary로 생성하는 법을 알아보자.

 

-단순 Dictionary로 생성

Dictionary.keys()는 column명을 생성하고, Dictionary.values()는 data역할을 한다.

단, 각 딕셔너리의 길이는 동일해야한다. 

data={'lee':[1,2,3],'kwan':[2,3,4],'doll':[3,4,5]}
df=pd.DataFrame(data)
df


	lee	kwan	doll
0	1	2	3
1	2	3	4
2	3	4	5

그럼 만일 dictionary.values()의 길이가 다르다면 어떨까

data={'lee':[1,2,3],'kwan':[2,3],'doll':[3,4,5]}
df=pd.DataFrame(data)
df

ValueError: arrays must all be same length

 

다음과같은 에러가 뜬다. 즉 이말은 values에 있는 리스트의 길이는 동일해야한다는 뜻이다.

 

다음은 Dictionary로 구성된 리스트로 생성하는 법을 알아보자.

 

-Dictionary로 구성된 리스트 생성

data=[{'lee':1,'kwan':2},{'lee':3,'doll':4},{'king':5,'laa':6}]
df=pd.DataFrame(data)
df

	lee	kwan	doll	king	laa
0	1.0	2.0	NaN	NaN	NaN
1	3.0	NaN	4.0	NaN	NaN
2	NaN	NaN	NaN	5.0	6.0

data=[]에 들어있는 리스트의 순서대로 각 인덱스가 인덱스로, 즉, dict1, dict2, dict3이 각각 0,1,2가 되는것이다.

또한 Dictionary.keys()는 column명으로, dictionary.values()는 data로 저장된다. 또한, 비어있는 부분은 모두 NaN값으로 처리한다.

 

여기서 만약 인덱스와 칼럼명을 지정해준다면 다음과 같이 변형된다.

data=[{'lee':1,'kwan':2},{'lee':3,'doll':4},{'king':5,'laa':6}]
df_1=pd.DataFrame(data,index=['zero','first','second'],columns=['lee','kwan','doll','king','laa'])
df_1

	lee	kwan	doll	king	laa
zero	1.0	2.0	NaN	NaN	NaN
first	3.0	NaN	4.0	NaN	NaN
second	NaN	NaN	NaN	5.0	6.0

위 데이터에서 key인 'lee'는 value를 2개 갖고있다. 그러므로 이것이 데이터프레임으로 처리할때는 순서대로 저장되는 것이다.

 

마지막으로 Sereis를 이용한 생성을 살펴보자.

 

Series를 이용한 생성

 

앞선 포스트처럼 시리즈는 액셀의 한 열이다. 그렇다면? 병합한다는 개념을 생각해보자.

series 또한 생성할때 리스트로 생성하는 법과 딕셔너리로 생성하는 법이 있었다. 

두가지를 각각 살펴보자.

 

-리스트로 생성된 Series를 이용한 생성

 

a=pd.Series([11,22,33],['a','b','c'])
b=pd.Series([44,55,66],['d','e','f'])
c=pd.Series([77,88,99],['i','j','k'])
df=pd.DataFrame([a,b,c])
df

	a	b	c	d	e	f	i	j	k
0	11.0	22.0	33.0	NaN	NaN	NaN	NaN	NaN	NaN
1	NaN	NaN	NaN	44.0	55.0	66.0	NaN	NaN	NaN
2	NaN	NaN	NaN	NaN	NaN	NaN	77.0	88.0	99.0

어떤 형식인지 이해해보자. 각 시리즈는 이차원 리스트로 되어있으며, Data와 Column으로 구성되어있다.

즉 이것을 모두 병합하여 처리를한다면, 위 결고와 같이 각각의 Column명으로 구성된 abcdefijk와 각각의 

데이터로 구성된 11,22,33,44,55,66,77,88,99로 된다. 

만일 예를들어, a라는 칼럼이 중복되어 11,33으로 되어있다면, a칼럼의 0번째 인덱스는 11,1번째 인덱스는 33으로 되는 것이다.

 

-딕셔너리로 생성된 Series를 이용한 생성

 

example={'lee':pd.Series([85,180],['weight','height']),'park':pd.Series([52,168],['weight','height'])}
df=pd.DataFrame(example)
df


	lee	park
weight	85	52
height	180	168

위 코드를 살펴보면 'lee'라는 칼럼명에는 시리즈 첫번째 리스트에 있는 값들이 그 다음에 지정해놓은 인덱스로 각각 처리되어 저장되는 모습이다. 실제 이런 것들은 직접 코딩을 해보고 눈으로 확인을 해봐야한다.

 

지금까지 크게 3가지로 구성된 자료구조로 어떻게 데이터프레임을 만들지는 상황마다 다르며 각자 쓰는 방법마다 다르다. 그러므로 이 세가지를 잘 숙지하는 것도 데이터를 다루는 능력에 절반은 차지할것이라고 생각한다(개인적 생각).

 

 

'Data analysis > Pandas' 카테고리의 다른 글

pandas.DataFrame.apply  (0) 2021.03.16
[Pandas] Series  (0) 2021.01.15
[Pandas] DataFrame 특정 칼럼 혹은 인덱스 선택  (0) 2021.01.13
[Pandas] DataFrame(개념)  (0) 2021.01.13

판다스는 소프트웨어 라이브러리 용으로 작성된 파이썬 프로그래밍 언어 데이터 조작 및 분석을 위한 패키지라고 볼 수 있다. 특히, 수치표와 시계열을 조작하기위한 데이터 구조와 연산을 제공해준다. 

 

판다스의 Series

판다스의 시리즈를 이해하기에 앞서 우리가 자주 접하는 엑셀을 한번 생각해보자. 

엑셀은 칼럽이 있고, 열들이 있다. 그 구조를 이해한 상태에서 시리즈를 직관적으로 이해한다면, 시트의 열 하나를 떠올리면된다. 

시리즈의 속성은 index와 values가 있다. 이는 아래 예시를 통해 한번 확인해보자.

시리즈를 생성하는 방법은 list형식, dictionary형식이 있다. 

우선 list형식으로 생성해보자.

example1=pd.Series(["undead","Kwandoll","JJang"])
example1

0      undead
1    Kwandoll
2       JJang
dtype: object

그 다음은 dictionary형식으로 생성해보자.

example2=pd.Series({"undead":33,"Kwandoll":22,"JJang":11})
example2

undead      33
Kwandoll    22
JJang       11
dtype: int64

차이점은 무엇일까?

1. 리스트 형식과 딕셔너리 형식의 생성 기호는 다르다. 즉 리스트는 [] 딕셔너리는 {} 이다. 이는 파이썬 기본을 공부한다면 누구나 아는 얘기지만, 모를수도 있기에 적어본다.

2. 인덱스가 다르다. 즉, 리스트형식으로 생성한다면 인덱스라인에 있는 숫자는 리스트 원래 인덱스넘버가 그대로 생성된다. 반대로 딕셔너리로 생성을 한다면, key,value형태이기에 key가 인덱스 value가 value로 들어가는 것이다.

이 차이를 정확하게 집어가야지만 데이터프레임을 이해하고, 그 데이터프레임을 다룰때 정확하게 처리할 수 있다.

 

시리즈 인덱싱

example1['undead']
33
example2[1]
'kwandoll'

말로 설명하는 것보다 예시가 이해에 더 빠르기에, 이렇게 작성해본다. 

해석) example1이라는 Series자료구조에서 인덱스가 'undead'인 value를 출력하라. 결과) 33

해석) example2라는 Series자료구조에서 인덱스가 1인 value를 출력하라. 결과) kwandoll

 

 

 

'Data analysis > Pandas' 카테고리의 다른 글

pandas.DataFrame.apply  (0) 2021.03.16
[Pandas] DataFrame  (0) 2021.01.15
[Pandas] DataFrame 특정 칼럼 혹은 인덱스 선택  (0) 2021.01.13
[Pandas] DataFrame(개념)  (0) 2021.01.13
titanic_data.iloc[0][3]

'Braund, Mr. Owen Harris'

데이터는 Titanic 데이터를 확인해보자.

titanic_data=pd.read_csv("C:/data/titanic/train.csv")
titanic_data

이런식으로 나오는 형태가 데이터프레임이다. 칼럼 즉 변수는 총 12개가 있다. 초심자라고 부담스러워 하지마라. 곧 할것이다.

실제 데이터를 다루기 시작할 때 가장 많이 사용하는 것이 특정 칼럼(변수) 혹은 특정열을 선택해서 아니면 각각의 범위를 지정해서 보는것이다. 실제 Pandas에서 제공해 주는 함수에는 정말 많은 것이 있지만, 대표적인 것만 설명하겠다. 

 

iloc

titanic_data.iloc[0]

위 전체 데이터와 비교해보자. 0번째 인덱스에 있는 value들을 전부 가져온다.

-특정 변수에서 필요한 인덱스 값을 갖고 와보자.

titanic_data.iloc[0][3]

'Braund, Mr. Owen Harris'

titanic_data.iloc[0]['Name']

'Braund, Mr. Owen Harris'

iloc이란 행이든 열이든 숫자로 location을 나타내서 Selecting or indexing 하는 방법이다. 그러나 변수 명을 집어넣어도 상관없다.

해석해보자. 행렬로 설명한다. iloc[행][열] 방식이다. 즉,

나는 [0]번째 전체 행에서 [3] 번째 행을 선택해 보고싶다.

나는 [0]번째 전체 행에서 ['Name']변수에 위치한 값을 선택해 보고싶다.

같은 의미이다.

 

정확한 표현 방식 및 정리는 다음과 같다.

 

titanic.iloc[1] # titanic 1번째 인덱스의 행 선택 추출
titanic.iloc[-1] # titanic 마지막 인덱스의 행 선택 추출
titanic.iloc[:,1] # titanic 1번째 인덱스의 열 선택 추출
titanic.iloc[:,-1] # titanic 마지막 인덱스의 열 선택 추출



titanic.iloc[0:5] # 0번째부터 5번째 인덱스 행 선택 추출
titanic.iloc[:,0:5] #0번째부터 5번째 열까지 선택 추출


titanic.iloc[[0,5,24],[1,4,7]] # 0,5,24 인덱스의 행과 1,4,7인덱스의 행 선택 추출

 

주의할점. 

-어떤 방식으로 내가 행과 열을 selection&extraction 하느냐에 따라 그 output structure은  데이터프레임이 될 수 있고 시리즈 형식이 될 수 있다.

-또한 인덱스라는 의미로 주석표기한 이유는 기본 파이썬 언어 인덱스는 0부터이다. 번째로 주석표기한다면 index+1을 해야하기에 혼동을 야기할 수 있으므로 인덱스로 표기한다.

 

iloc은 요즘 잘 사용하지 않는다고 한다. 하지만 코딩을 활용한 분석에서의 코딩은 내가 원하는 방식으로 이끌어가도 괜찮다고 생각한다.

 

'Data analysis > Pandas' 카테고리의 다른 글

pandas.DataFrame.apply  (0) 2021.03.16
[Pandas] DataFrame  (0) 2021.01.15
[Pandas] Series  (0) 2021.01.15
[Pandas] DataFrame(개념)  (0) 2021.01.13

Pandas 데이터 분석을 시작하려면 무조건, 필수로 import 해야되는 라이브러리. 내가 공부하는게 아니라 누군가를 알려줘야 한다고 생각할때, 과연 어떤 방식으로 쉽게 설명을 해줄까...하다가 우선 데이터프레임을 이해하기 전에 어떤식으로 코딩을 하는지를 먼저 알려주는게 나을 것 같다. 바로 시작해보자.

 

import pandas as pd 
import numpy as np
import matplotlib.pyplot as plt

 

본인은 초심자들을 위한 내용을 제공할 것이기에, 어느정도 숙련도가 있는 분석가들은 과감하게 나가 주길 바란다.

-import [main_library] as [value] 즉, padas라이브러리를 가져올건데 나는 이걸 사용하기 위해 pd로 줄여서 쓸거야 왜냐면 귀찮거든 이라는 의미다. 좀더 추가로 설명하자면 pd를 ks 로 바꿔 설정해도 상관없다.

-근데 왜 이렇게 해야하는가.. 지금 시작할 튜토리얼과 연관성이 있다.

padas.DataFrame(~~)
pd.DataFrame(~~)

호출라이브러리.호출라이브러리기능 순이다. 즉 pandas를 하면 귀찮다! 

 

<다시 본론으로...>

그래서 결국 pandas에서 DataFrame이란 무엇이냐... 통계분석 언어 중 하나인 R이 있다. 온전히 통계 분석을 위해 개발된 R 과는 다르게 python은 일반 프로그램언어이다. 그러므로 데이터 분석을 하기 위해서는 여러가지 라이브러리를 사용할 수 밖에 없는 것이다. 이 패키지들 중 R의 dataframe 데이터 타입을 참고하여 만든 것이 바로 pandas dataframe이다. pandas는 dataframe을 주로 다루기 위한 라이브러리이며, dataframe을 자유롭게 가공하는 것은 데이터 분석가들에게 중요하다. 

우리가 데이터를 다루려면 파이썬 자료구조인 리스트, 튜플, 딕셔너리와 같은 것을 써야하는데 자유자재로 변경 및 처리가 가능하다면, 데이터프레임이 굳이 필요 없을지도..?

 

우리가 데이터 분석을 하게 된다면 직접 데이터를 만들지 않는다. csv 및 excel 등에 저장되어있는 데이터를 받아오는데 요즘 웹 블로그에서는 만드는 것부터 설명을 해준다. 본인은 생략한다.

불러오자

csv_data=pd.read_csv("C:/data/파일이름.csv")
excel_data=pd.read_excel("C:/data/파일이름.xlsx")

*여담으로 경로 찾아줄 때 절대경로에 저장해있으면 파일이름만 적으면 되지만 다른 경로에 저장되어있다면 위치도 적어주자.

*파일경로 적을때 \\ or /  두가지이다. 백슬래시(\) 하나로는 인식을 못하는게 함정이다.

*불러왔으면 이제 어떤식으로 건드려봐야할지는 다음장에 설명하겠다.

 

'Data analysis > Pandas' 카테고리의 다른 글

pandas.DataFrame.apply  (0) 2021.03.16
[Pandas] DataFrame  (0) 2021.01.15
[Pandas] Series  (0) 2021.01.15
[Pandas] DataFrame 특정 칼럼 혹은 인덱스 선택  (0) 2021.01.13

+ Recent posts