Pandas 기초 1 - Series, DataFrame, apply


Index

1. Pandas란?

      1_ Pandas 의 두가지 데이터 타입

      2_ Pandas  데이터 타입의 차이점

    

2. Series

      1_ Series 사용법

      2_ Series의 index설정

      3_ Series의 broadcasting(broadcasting) 

      4_ Series의 Offset index

      5_ Series의 연산

 

3. DataFrame

      1_ dictionary 안의 list로 DataFrame만들기 

      2_ list 안의 dictionary로 DataFrame만들기

      3_ DataFrame의 index 설정

      4_ DataFrame 에서 데이터 선택하기 _ row/colum/ (row, column)

      5_ DataFrame 의 수정과 데이터 추가

      6_ 컬럼 데이터 수정

 

4. Apply 함수

      1_ Apply란?

      2_ Apply 활용


Pandas 기초 1 - Series, DataFrame, apply

1. Pandas란?

데이터 분석을 위해, 만들어진 오픈소스 python 라이브러리입니다. 

 

데이터 분석을 위해 R을 사용하시는 분들도 계시지만, 분석 이외에도 다양한

활용을 위해 python의 pandas를 활용한 분석을 추천드립니다. 

 

1_ Pandas의 두가지 데이터 타입

pandas는 두가지 데이터 타입을 사용합니다. 

 

  • Series : index(행의 넘버링)와 values(값)을 가집니다. 
  • DataFrame : index와 values 그리고 columns를 가집니다. 


2_ Pandas의 데이터 타입의 차이점 

  • columns의 유무 (Dataframe만 columns를 가짐) 
  • Series는 value들의 데이터 타입이 동일해야하지만
    DataFrame 은 columns 덕분에 각각의 컬럼마다 데이터 타입이 다르게 지정 가능합니다. 


2. Series

  • 동일한 데이터 타입의 값을 갖습니다.
  • value 만 설정하면 index는 0부터 자동으로 설정 됩니다.


1_ Series 사용법

pd.series() 를 사용해서 만들 수 있습니다. 

 

[코드예제]

import numpy as np
import pandas as pd
data = pd.Series(np.random.randint(10, size=5))
data

[결과] 

0    5
1    5
2    3
3    0
4    3
dtype: int64

 

 2_ Series의 index설정

시리즈의 index 설정하는 방법은 index=list() 파라미터를 사용하여서 설정할 수 있습니다

 

[코드예제]

# index 설정
data = pd.Series(np.random.randint(10, size=5), 
                index=list("ABCDE"))
data

[결과] 

A    3
B    7
C    3
D    3
E    6
dtype: int64

 

data의 인덱스와 값을 확인해보겠습니다. 

 

[코드예제]

data.index, data.values

[결과] 

(Index(['A', 'B', 'C', 'D', 'E'], dtype='object'), array([3, 7, 3, 3, 6]))

 

인덱스를 통해 값을 확인하는 방법은 두가지가 있습니다

  • data["B"]
  • data.B  → 이 경우에는 인덱스가 "숫자"가 아닐 경우에 간편하게 사용할 수 있는 방법

[코드예제]

data["B"], data.B

[결과] 

(7, 7)

 

데이터를 수정하는 방법은 인덱스로 바꾸고 싶은 값을 지정하여 변경하면 됩니다.

 

[코드예제]

data["C"] = 10
data

[결과] 

A     3
B     7
C    10
D     3
E     6
dtype: int64

 

3_ Series의 브로드캐스팅 (broadcasting) 

하나의 배열or 요소가 어떤 특정 배열에 영향을 미칠때 배열간의 형상을 맞추는 것을 브로드 캐스팅이라고 합니다 

NumPy의 브로드 캐스팅처럼, series역시 브로드 캐스팅이 가능합니다.

 

데이터 * 10을 하면 각 값들에 *10이 되어서 나타나는 것을 확인할 수 있습니다. 

 

[코드예제]

data * 10

[결과] 

A     30
B     70
C    100
D     30
E     60
dtype: int64

 

 

4_ Series의 Offset index

오프셋 인덱스를 통해서 데이터를 선택하는 것도 가능합니다

 

3번째 데이터에서 끝까지, 2칸씩 점프하는 데이터를 선택해보겠습니다.

[코드예제]

data[2::2]

[결과] 

C    10
E     6
dtype: int64

 

처음부터 끝까지, 역순으로 데이터를 정렬해보겠습니다. 

[코드예제]

data[::-1]

[결과] 

E     6
D     3
C    10
B     7
A     3
dtype: int64


 5_ Series의 연산

시리즈의 연산에 대해서 배워보겠습니다. 

 

 

[코드예제]

data

[결과] 

A     3
B     7
C    10
D     3
E     6
dtype: int64

 

딕셔너리(dictionary)를 통해 data2를 만들어보겠습니다. 

 

[코드예제]

data2 = pd.Series({"D":3, "E":5, "F":7})
data2

[결과] 

D    3
E    5
F    7
dtype: int64

 

 

data와 data2를 더하면 같은 index끼리 자동으로 저해지는 것을 확인할 수 있습니다. 

NaN이라고 적힌 A,B,C,F 값들은 data2에 데이터가 없기 때문에 더하지 않는 것입니다. 

 

[코드예제]

result = data + data2
result # None

[결과] 

A     NaN
B     NaN
C     NaN
D     6.0
E    11.0
F     NaN
dtype: float64

이런 현상을 방지하기 위해 마스킹을 이용해 data 시리즈의 값들을 그대로 넣어주겠습니다. 

먼저 result.isnull() 을 사용해서 데이터에서 NaN 값들만 먼저 확인합니다. 

boolen값으로 True & False 값으로 출력됩니다. 

 

[코드예제]

result.isnull()

 [결과]

A     True
B     True
C     True
D    False
E    False
F     True
dtype: bool

 

true로 마스킹 된 값에  data 시리즈의 값을 지정해주면 

같은 인덱스 값들로 채워줍니다.

 

[코드예제]

result[result.isnull()] = data
result

[결과] 

A     3.0
B     7.0
C    10.0
D     6.0
E    11.0
F     NaN
dtype: float64

 

마찬가지로, F 값이 비어진 것은

시리즈 data2를 이용해서 넣어주겠습니다 

[코드예제]

result[result.isnull()] = data2
result

[결과] 

A     3.0
B     7.0
C    10.0
D     6.0
E    11.0
F     7.0
dtype: float64

 


3. DataFrame

  • 데이터 프레임은 여러개의 Series로 구성되어있습니다. 
  • 같은 컬럼에 있는 value값은 같은 데이터 타입을 갖지만, columns 마다 다른 값을 가질 수 있습니다. 
  • 데이터 프레임을 만드는 방법은 두가지 입니다. 

    -  Dictinary 안의 List
    -  List안의 Dictionary 

 

 1_ dictionary 안의 list로 DataFrame만들기 

{ } 딕셔너리 안에 [ ] 리스트로 데이터 프레임을 만들어보겠습니다. 

여기서 딕셔너리 안의 key 값이 column이 된다는 것을 확인 할 수 있습니다.

 

[코드예제]

datas = {
    "name":["joy", "collection"],
    "email":["joy@gmail.com", "collection@naver.com"],
}
print(datas)

[결과] 

{'name': ['joy', 'collection'], 'email': ['joy@gmail.com', 'collection@naver.com']}

 

 

[코드예제]

df = pd.DataFrame(datas)
df

[결과] 

 

2_ list 안의 dictionary로 DataFrame만들기

[ ] 리스트 안에 { } 딕셔너리를 통해 데이터 프레임을 만들어보겠습니다. 

여기서도 마찬가지로 key값이 column이 되는 것을 확인할 수 있습니다.

 

[코드예제]

datas = [
    {"name":"joy", "email":"joy@gmail.com"},
    {"name":"collecetion", "email":"collection@naver.com"},
]
datas

[결과] 

[{'name': 'joy', 'email': 'joy@gmail.com'},
 {'name': 'collecetion', 'email': 'collection@naver.com'}]

 

column의 순서는 자동으로 알파벳 순서로 들어가게 됩니다. 

 

[코드예제]

df = pd.DataFrame(datas)
df

[결과] 


3_ DataFrame의 index 설정

위에서 두가지 방법으로 데이터 프레임을 만들었지만, 인덱스가 설정되지 않았다는 것을

확인 할 수 있습니다. 파라미터에서 index = [] 을 사용해 인덱스를 설정해줍니다. 

 

[코드예제]

df = pd.DataFrame(datas, index=["one", "two"])
df

[결과] 

 

  • 인덱스만 확인하는 방법은 df.index를 통해서 설정할 수 있습니다. 

 

[코드예제]

df.index

[결과] 

Index(['one', 'two'], dtype='object')

 

  • column만 확인하는 방법은 df. column을 통해 확인할 수 있습니다. 

[코드예제]

df.columns

[결과] 

Index(['email', 'name'], dtype='object')

 

  • values (값) 을 확인하는 방법은 df.values를 통해 확인할 수 있습니다.

[코드예제]

df.values

[결과] 

array([['joy', 'joy@gmail.com'],
       ['collecetion', 'collection@naver.com']], dtype=object)



4_ DataFrame 에서 데이터 선택하기 _ row/column/ (row, column)

이제 데이터 프레임에서, 행row, 열column, 행렬(row, column) 을 확인하는 방법을 배워보겠습니다

 

  • 행(row) 선택 : loc 
  • 사용법 : df.loc[index] 

[코드예제]

df = pd.DataFrame(datas)
df

[결과] 

 

여기 데이터 프레임에서 .loc[1] 선택하면 두번째 행이 선택되고, 그 상태에서 

column값  [email]을 입력하면 값(value)를 확인할 수 있습니다. 

 

[코드예제]

df.loc[1]["email"]

[결과] 

'collection@naver.com'

 

 

만약에 기존 데이터에서 index가 있으면 데이터가 수정되고,

index가 없으면 데이터가 추가됩니다. 

기존에 없던 3번째 행 .loc[2]에 딕셔너리로 새로운 데이터를 입력해주니,

데이터 프레임의 3번째 행이 생기는 것을 확인할 수 있습니다.

 

[코드예제]

df.loc[2] = {"name":"blog", "email":"blog@daum.net"}
df

[결과] 

 

 

 

  • 열(column) 선택 : df[column]
  • 사용법 : df[column] 

 

[코드예제]

df

[결과] 

 

 

name 컬럼을 확인하려면 df["name"]을 입력하여 값을 확인 할 수 있습니다.

 

[코드예제]

df["name"]

[결과] 

 

row 와 마찬가지로 없는 column 에 값을 입력하면 새로운 열이 형성되는 것을 확인할 수 있습니다. 

 

[코드예제]

df["id"] = ""
df

[결과] 

 

 

비어있는 값에 range를 활용하여 값을 넣어보겠습니다. 

 

[코드예제]

df["id"] = range(1, 4) # np.arange(1, 4)
df

[결과] 

 

[코드예제]

df.dtypes

[결과] 

name     object
email    object
id        int32
dtype: object

 

 

  • 행열(row, column)을 동시에 선택하겠습니다. 
  • 리스트를 통해 만들 수 있습니다. 

 

1번째와 3번째 행의 email, id  컬럼을 선택하겠습니다.

[코드예제]

df.loc[[0, 2], ["email", "id"]]

[결과] 

 

 

기존에는 알파벳 순서로 자동 입력되던 컬럼의 순서를 바꿀 수 있습니다. 

df[[ , , ]] 리스트로 정렬되기 원하는 순서대로 column을 입력합니다. 

 

[코드예제]

df[["id", "name", "email"]]

[결과] 

 

head는 앞부분을, tail은 맨 뒷부분의 데이터를 조회할 수 있습니다. 

[코드예제]

df.head(2)

[결과] 

 

[코드예제]

df.tail(2)

[결과] 

 

3. apply 함수

  • 순서가 있는 데이터 집합에서 모든 값에 함수를 적용시키는 map 함수와 비슷합니다 

email 컬럼에서 메일의 도메인만 가져와서 새로운 domain 컬럼을 생성해보겠습니다. 

[코드예제]

df

[결과] 

 

 

[코드예제]

def domain(email):
    return email.split("@")[1].split(".")[0]

domain(df.loc[0]["email"])

[결과] 

'gmail'

 

 

[코드예제]

df["domain"] = df["email"].apply(domain)
df

[결과]

 

[코드예제]

df["domain"] = df["email"].apply(lambda email: email.split("@")[1].split(".")[0])
df

[결과] 

 

 

댓글

Designed by JB FACTORY