반응형
반응형

안녕하세요. PSYda입니다.

이번 포스팅에서는 Pandas의 DataFrame에 대해 알아보겠습니다.

소개할 내용은 아래와 같습니다.

  • DataFrame 생성
  • DataFrame에 Data추가/삭제/조회

2. DataFrame

DataFrame 이란?

  • 2차원 데이터
  • 인덱스가 같은 하나 이상의 Series가 모여진 데이터
  • DBMS 의 관계형 Table 과 매우 유사

먼저 DataFrame을 사용하기 위해 Pandas 라이브러리를 import 합니다.

# pandas library import
import pandas as pd
from pandas import Series, DataFrame

2.1 DataFrame 데이터 생성

DataFrame을 생성하기 위해 셀에 DataFrame() 이라고 입력하고 괄호 안에서 Shift+tab 을 눌러보면 아래와 같은 정보가 보입니다.

DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)

값을 입력해줄 수 있고, Default 가 None이기 때문에 값이 없으면 아무 동작도 하지 않습니다. 속성값들을 하나씩 알아보겠습니다.

  • data : 저장되는 데이터
  • index : index에 대한 정보(미입력시 0부터 순차적으로 부여)
  • columns : 열에 대한 이름값(미입력시 0부터 순차적으로 부여)
  • dtype : 데이터에 대한 타입 명시(미입력시 자체적으로 판단)

예제를 확인하겠습니다.

Data1 = DataFrame([[180,75],[160,65],[170,75], [175,80]],
                  index = ["사람1","사람2","사람3","사람4"],
                  columns = ["키","몸무게"])
Data1

몸무게
사람1 180 75
사람2 160 65
사람3 170 75
사람4 175 80

index와 columns의 경우 선언후에도 별도로 입력할 수도 있습니다.

Data1 = DataFrame([[180,75],[160,65],[170,75], [175,80]])
Data1

0 1
0 180 75
1 160 65
2 170 75
3 175 80
# 인덱스 저장
Data1.index = ["Man1","Man2","Man3","Man4"]
Data1

0 1
Man1 180 75
Man2 160 65
Man3 170 75
Man4 175 80
# 컬럼명 저장
Data1.columns = ["Height","Weight"]
Data1

Height Weight
Man1 180 75
Man2 160 65
Man3 170 75
Man4 175 80

2.2 데이터 추가, 삭제

2.2.1 Column 추가

2.2.1.1 값으로 추가

Data1["나이"] = [30,40,32,33]
Data1

Height Weight 나이
Man1 180 75 30
Man2 160 65 40
Man3 170 75 32
Man4 175 80 33

2.2.1.2 Series 또는 DataFrame에서 추가

# bmi = 몸무게(kg) / 키(m)*키(m)
Data1["BMI"] = Data1["Weight"] / ((Data1["Height"] / 100) * (Data1["Height"] / 100))
Data1

Height Weight 나이 BMI
Man1 180 75 30 23.148148
Man2 160 65 40 25.390625
Man3 170 75 32 25.951557
Man4 175 80 33 26.122449

2.2.2 행 추가

append 함수를 이용해서 행기준으로 데이터를 추가 할 수 있습니다.

2.2.2.1 Series와 List를 이용한 행추가

listOfSeries = [pd.Series([187, 85, 34, 0], index = Data1.columns),
               pd.Series([183, 80, 32, 0], index = Data1.columns)]
Data1 = Data1.append(listOfSeries)
Data1

Height Weight 나이 BMI
Man1 180 75 30 23.148148
Man2 160 65 40 25.390625
Man3 170 75 32 25.951557
Man4 175 80 33 26.122449
0 187 85 34 0.000000
1 183 80 32 0.000000

2.2.2.2 DataFrame을 행기준으로 추가

df = DataFrame([[180,75,30,33],[160,65,40,22]],
               index = ["사람5","사람6"],
               columns = ["Height","Weight","나이","BMI"])
df

Height Weight 나이 BMI
사람5 180 75 30 33
사람6 160 65 40 22
Data1.append(df)

Height Weight 나이 BMI
Man1 180 75 30 23.148148
Man2 160 65 40 25.390625
Man3 170 75 32 25.951557
Man4 175 80 33 26.122449
0 187 85 34 0.000000
1 183 80 32 0.000000
사람5 180 75 30 33.000000
사람6 160 65 40 22.000000

2.2.3 데이터 삭제

drop 함수를 쓰면 행과 열을 삭제 할 수 있습니다.

axis option

  • 0 : 행 기준 삭제
  • 1 : 열 기준 삭제

2.2.3.1 열 삭제

Data1 = Data1.drop("BMI", axis = 1)
Data1

Height Weight 나이
Man1 180 75 30
Man2 160 65 40
Man3 170 75 32
Man4 175 80 33
0 187 85 34
1 183 80 32

2.2.3.2 행 삭제

Data1 = Data1.drop("Man1", axis = 0)
Data1

Height Weight 나이
Man2 160 65 40
Man3 170 75 32
Man4 175 80 33
0 187 85 34
1 183 80 32

2.3 DataFrame 조회

# 예제를 위한 데이터 생성
Data2 = DataFrame([[180,75,30],[160,65,40],[170,75,32], [175,80,33]],
                  index = ["사람1","사람2","사람3","사람4"],
                  columns = ["키","몸무게","나이"])
Data2

몸무게 나이
사람1 180 75 30
사람2 160 65 40
사람3 170 75 32
사람4 175 80 33

2.3.1 Column 조회

DataFrame명["속성명"] 또는 DataFrame명.속성명을 통해 특정 속성명만 조회 할 수 있다.

하나의 속성명을 조회 하면 SeriesType, 여러 속성명을 조회 하면 DataFrame으로 출력된다.

# 키 Column 만 조회
Data2["키"]
사람1    180
사람2    160
사람3    170
사람4    175
Name: 키, dtype: int64
# Type 은 Series
type(Data2.몸무게)
pandas.core.series.Series
# 두 개 이상 컬럼 조회
Data2[["키", "몸무게"]]

몸무게
사람1 180 75
사람2 160 65
사람3 170 75
사람4 175 80

2.3.2 Index 조회

  • DataFrame명.loc["index명"] 을 통해 특정 index만 조회 가능하다.
  • DataFrame명.iloc[index번호] 를 통해 특정 index만 조회 가능하다.

마찬가지로 하나의 index만 조회 할 경우 Series Type, 여러 index의 경우 DataFrame Type으로 출력한다.

Data2.loc["사람1"]
키      180
몸무게     75
나이      30
Name: 사람1, dtype: int64
# 1번 인덱스 --> 사람2의 정보만 출력
Data2.iloc[1]
키      160
몸무게     65
나이      40
Name: 사람2, dtype: int64
# 두 개 index를 index명으로 조회
Data2.loc[["사람1","사람2"]]

몸무게 나이
사람1 180 75 30
사람2 160 65 40
# 여러 개의 index를 index번호로 조회
Data2.iloc[1:3]

몸무게 나이
사람2 160 65 40
사람3 170 75 32

2.3.3 Index 와 column 동시 조회

하나의 index 명과 컬럼명에 해당하는 하나의 값 찾기

  • DataFrame명.at["index명","컬럼명"]
  • DataFrame명.loc["index명","컬럼명"]
  • DataFrame명.loc["index명"]["컬럼명"]
여러 index명과 컬럼명에 해당하는 여러 값 찾기
  • DataFrame명.loc[["index명1","index명2"],["컬럼명1","컬럼명2"]]
  • DataFrame명.loc[["index명1","index명2"]][["컬럼명1","컬럼명2"]]
#사람1의 나이 찾기
Data2.loc["사람1","나이"]
30
#사람2의 몸무게 찾기
Data2.loc["사람2"]["몸무게"]
65
#사람3의 키 찾기
Data2.at["사람3","키"]
170
# 사람1, 사람2 의 키 조회
Data2.loc[["사람1","사람2"]]["키"]
사람1    180
사람2    160
Name: 키, dtype: int64
# 사람1,사람2 의 키와 몸무게 조회
Data2.loc[["사람1","사람2"],["키","몸무게"]]

몸무게
사람1 180 75
사람2 160 65

하나의 index 번호와 컬럼번호에 해당하는 하나의 값 찾기

  • DataFrame명.iat[index번호,컬럼번호]
  • DataFrame명.iloc[index번호,컬럼번호]
  • DataFrame명.iloc[index번호][컬럼번호]
여러 index 번호와 컬럼번호에 해당하는 여러 값 찾기
  • DataFrame명.iloc[index번호1:index번호2,컬럼번호1:컬럼명번호2]
# 사람1의 나이 찾기
Data2.iloc[0,2]
30
#사람2의 몸무게 찾기
Data2.iloc[1][1]
65
#사람3의 키 찾기
Data2.iat[2,0]
170
# 사람1, 사람2 의 키 조회
Data2.iloc[0:2,0]
사람1    180
사람2    160
Name: 키, dtype: int64
# 사람1,사람2 의 키와 몸무게 조회
Data2.iloc[0:2,0:2]

몸무게
사람1 180 75
사람2 160 65

2.3.4 조건 조회

# 키가 170 이상인 사람만 조회
Data2[Data2["키"] >= 170]

몸무게 나이
사람1 180 75 30
사람3 170 75 32
사람4 175 80 33

2.3.5 상위/하위 데이터 조회

  • head(개수) : 위에서부터 개수만큼의 데이터만 출력
  • tail(개수) : 밑에서부터 개수만큼의 데이터만 출력
개수를 쓰지 않을 경우 5개만 출력
Data2.head(2)

몸무게 나이
사람1 180 75 30
사람2 160 65 40
Data2.tail(2)

몸무게 나이
사람3 170 75 32
사람4 175 80 33

위의 Jupyter notebook 내용은 여기 Github에서도 확인 할 수 있습니다.

감사합니다.

반응형
반응형

안녕하세요. PSYda 입니다.
Pandas는 2개의 자료구조(Series , DataFrame)를 가지고 있습니다.
Series는 1차원 데이터 구조, DataFrame은 2차원 데이터 구조를 나타냅니다.
이번 포스팅에서는 Series에 대해 아래와 같은 내용을 알아볼 예정입니다.

  • Series 데이터의 생성
  • Series 데이터의 조회
  • Series 산술 연산
  • Series 통계

1. Series

Series란?

  • 1차원 데이터
  • Index 와 Value 로 구성(Python의 사전데이터와 유사)

먼저 Series 나 DataFrame을 사용하기 위해 Pandas 라이브러리를 import 해야합니다.(설치는 이전 블로그를 참고해주세요.)

# pandas library import
import pandas as pd
from pandas import Series, DataFrame

1.1 Series 데이터 생성

  • Python 자료형으로 생성가능(리스트, 튜플, 사전)
  • numpy array 자료형으로 생성가능

1.1.1 리스트로 Series 생성

data = pd.Series([1,2,3,4])
data
0    1
1    2
2    3
3    4
dtype: int64

1.1.2 튜플로 Series 생성

data = pd.Series((1,2,3,4))
data
0    1
1    2
2    3
3    4
dtype: int64

1.1.3 numpy.array로 Series 생성

import numpy as np
data = pd.Series(np.array([1,2,3,4]))
data
0    1
1    2
2    3
3    4
dtype: int32

위의 3가지 방법으로 생성한 Series 를 보면, Value 값(1,2,3,4)과 index 값(0,1,2,3)으로 저장되는 것을 확인 할 수 있습니다.
index를 key라고 한다면, key와 value로 이루어진 dict(사전) 타입과 비슷하다는 점을 알 수 있습니다.
물론 아래와 같이 사전 타입으로도 생성이 가능합니다.

1.1.4 사전타입으로 Series 생성

data = pd.Series({1:1, 2:2, 3:3 ,4:4})
data
1    1
2    2
3    3
4    4
dtype: int64

1,2,3,4 라는 key값이 index로 저장되고 1,2,3,4 라는 데이터가 value로 저장되는 것을 확인 할 수 있습니다. method를 통해 index와 value 값을 따로 가져 올 수도 있습니다.

# index 값 가져 오기
data.index
Int64Index([1, 2, 3, 4], dtype='int64')
# value 값 가져 오기
data.values
array([1, 2, 3, 4], dtype=int64)

위의 결과들을 보면 "dtype = int64" 라는 구문을 볼 수 있습니다. int형 외에 다른 자료형들도 Series에 저장 될 수 있습니다.

1.1.5 여러 자료형으로 Series 생성

data.dtypes
dtype('int64')
# 여러 자료형으로 Series 생성
data2 = Series(["pandas", "PSY", 34])
data2
0    pandas
1       PSY
2        34
dtype: object
data2.dtypes
dtype('O')

문자열을 포함한 숫자가 아닌 형태의 자료형이 Series에 저장되면 Object type으로 저장 되는 것을 확인 할 수 있습니다.

1.2 Series의 index

  • 사전형으로 Series를 생성하면사전형의 key값이 index로 저장
  • 사전형이 아닌 데이터로 Series 생성할 때 index를 명시적으로 입력 가능
  • 입력값이 없다면 0부터 순서대로 번호를 부여

1.2.1 Series 생성시에 Index명 입력

data3 = Series(["토트넘", "손흥민" , 30], index = ["팀명","선수명","Goal수"])
data3
팀명       토트넘
선수명      손흥민
Goal수     30
dtype: object
data3.index
Index(['팀명', '선수명', 'Goal수'], dtype='object')

1.2.2 이미 생성되어 있는 Series의 index명 변경

data3.index = ["도시명", "사는사람" , "나이"]
data3.index
Index(['도시명', '사는사람', '나이'], dtype='object')

1.3 Series의 조회(색인)

Series의 데이터를 조회하는 기법에 대해 설명하기 위해 Series 하나를 만들어 보겠습니다.

data4 = Series([1,2,3,4,5,6,7,8,9],index = ["서울","대전","대구","부산","광주","전주","충주","마산","성남"])
data4
서울    1
대전    2
대구    3
부산    4
광주    5
전주    6
충주    7
마산    8
성남    9
dtype: int64

1.3.1 index 기준으로 조회

#서울 데이터 조회
data4.at["서울"]
1
#서울, 부산 데이터 조회
data4[["부산","서울"]]
부산    4
서울    1
dtype: int64
# 위에서 부터 2개 Data
data4[0:2]
서울    1
대전    2
dtype: int64
# 끝에서 3개 Data
data4[-3:]
충주    7
마산    8
성남    9
dtype: int64

1.3.2 index 조건 색인

# 서울, 대전 ,대구 데이터 조회
# isin 함수에 인자에 해당하는 index 만 True값을 가지고, True값만 출력
data4[data4.index.isin(["서울","대전", "대구"])]
서울    1
대전    2
대구    3
dtype: int64

1.3.3 조건으로 조회

# 3이상인 데이터만 조회하는 방법
# 1. 각 데이터가 3보다 큰지 확인
data4 > 3
서울    False
대전    False
대구    False
부산     True
광주     True
전주     True
충주     True
마산     True
성남     True
dtype: bool
# 2. True 인 데이터만 조회
data4[ data4 > 3 ]
부산    4
광주    5
전주    6
충주    7
마산    8
성남    9
dtype: int64

1.4 Series의 산술 연산 및 통계

1.4.1 상수와의 연산

# data4의 모든 데이터에 10 더하기
data4 + 10
서울    11
대전    12
대구    13
부산    14
광주    15
전주    16
충주    17
마산    18
성남    19
dtype: int64
# add 함수를 이용해 더하기
data4.add(10)
서울    11
대전    12
대구    13
부산    14
광주    15
전주    16
충주    17
마산    18
성남    19
dtype: int64

1.4.2 Series 끼리의 연산

  • 두 Series의 같은 index 끼리 연산함
  • 같은 index가 없을 경우 NaN으로 저장됨

연산을 위해 새로운 Series 생성

data5 = Series([10,20,30],index = ["서울","대전","대구"])
data5
서울    10
대전    20
대구    30
dtype: int64
data6 = data4 + data5
data6
광주     NaN
대구    33.0
대전    22.0
마산     NaN
부산     NaN
서울    11.0
성남     NaN
전주     NaN
충주     NaN
dtype: float64

위의 과정을 보면 Series끼리의 연산이 어떻게 동작되는지 알 수 있습니다.
첫 번째로 두 Series의 Index명이 동일하면 연산을 수행합니다. 그 예시로 첫 번째 Series의 "서울", "대전", "대구" 의 데이터와 두 번째 Series의 "서울", "대전", "대구" 의 데이터가 합해지는 것을 볼 수 있습니다.
두 번째 과정을 보면 두 Series에서 동일한 Index가 없는 경우 NaN이 됩니다.
NaN은 데이터가 없다는 뜻으로 타언어의 Null과 동일한 개념입니다.

1.5 NaN 데이터 처리

  • fill_value 옵션 : NaN 데이터를 입력값으로 적용후에 함수 적용
  • fillna 함수 : NaN값을 입력값으로 변경

add와 같은 산술연산함수를 적용할 때 fill_value 옵션을 적용하면 NaN이 발생할 경우 특정 값으로 대입할 수 있습니다.

data4.add(data5, fill_value = 0)
광주     5.0
대구    33.0
대전    22.0
마산     8.0
부산     4.0
서울    11.0
성남     9.0
전주     6.0
충주     7.0
dtype: float64

Series에 NaN값이 있을 경우 fillna를 이용해 NaN을 입력값으로 변경할 수 있습니다.

# fillna를 통해 NaN값을 특정값으로 할당
data6.fillna(0)
광주     0.0
대구    33.0
대전    22.0
마산     0.0
부산     0.0
서울    11.0
성남     0.0
전주     0.0
충주     0.0
dtype: float64

1.6 통계

  • describe 함수 : 주요 통계 정보 보기
  • mean 함수 : 평균 구하기
  • std 함수 : 표준편차 구하기
# 데이터 통계 정보 보기
data4.describe()
count    9.000000
mean     5.000000
std      2.738613
min      1.000000
25%      3.000000
50%      5.000000
75%      7.000000
max      9.000000
dtype: float64
# 평균 구하기
data4.mean()
5.0
# 표준 편차 구하기
data4.std()
2.7386127875258306

위의 Jupyter notebook 내용은 여기 Github에서도 확인 할 수 있습니다.
감사합니다.

반응형

+ Recent posts

반응형