반응형
반응형

안녕하세요. PSYda입니다.

이번 포스팅에서는 DataFrame의 집계(그루핑) 함수에 대해 알아보겠습니다.

집계함수란 데이터를 몇몇의 집단으로 나누어 집단간 평균, 합계 등의 연산을 수행하는 함수를 얘기합니다.
예를 들어 고등학교 학생 전체 성적 데이터가 있을 경우 반별영어성적에 대한 평균을 내거나, 과목별로 학생들의 성적에 대한 평균을 내는 것과 같습니다.
예와 같이 집계함수를 적용하기 위해서는 3가지 값이 필요하며, 그 값은 그룹할 기준(반별 또는 과목별), 연산을 수행할 값(영어성적), 연산 함수(평균) 입니다.

이번 포스팅에서 소개할 내용을 요약하면 아래와 같습니다.

  • groupby 함수을 사용한 DataFrame 집계
  • pivot_table 함수를 사용한 DataFrame 집계

실습에 사용한 데이터는 fifa19에 등장하는 축구선수들의 능력치 데이터입니다.
데이터는 아래에서 다운로드 받을 수 있습니다.

Ch10_1_fifaStats2.csv
다운로드

9. DataFrame의 집계함수

DataFrame을 집계할 수 있는 두 개의 함수

  • groupby
  • pivot_table

9.1 groupby 함수

groupby 함수를 사용한 집계 연산은 두 단계로 이루어짐

  • DataFrame을 그룹별로 나누는 단계
  • 나누어진 그룹에서 집계 함수(sum, mean, max 등)를 수행하는 단계

Library import

import pandas as pd
from pandas import Series , DataFrame
import numpy as np
player = pd.read_csv('data/Ch10_1_fifaStats2.csv')
player.head()

Name Age Nationality Club Preferred Foot Crossing Dribbling LongPassing ShotPower
0 L. Messi 31 Argentina FC Barcelona Left 84.0 97.0 87.0 85.0
1 Cristiano Ronaldo 33 Portugal Juventus Right 84.0 88.0 77.0 95.0
2 Neymar Jr 26 Brazil Paris Saint-Germain Right 79.0 96.0 78.0 80.0
3 De Gea 27 Spain Manchester United Right 17.0 18.0 51.0 31.0
4 K. De Bruyne 27 Belgium Manchester City Right 93.0 86.0 91.0 91.0

9.1.1 그룹핑 한줄로 수행하기

팀별선수의 능력치에 대한 평균값 확인(최상위 5개 팀 조회)

spByTeam = player.groupby('Club').mean()
spByTeam.sort_values(by = 'LongPassing', ascending = False).head()

Age Crossing Dribbling LongPassing ShotPower
Club
Chelsea 25.212121 59.484848 65.666667 65.787879 64.060606
FC Barcelona 23.848485 59.818182 66.121212 65.727273 64.303030
Manchester United 24.757576 62.242424 66.878788 65.727273 66.151515
Manchester City 23.909091 59.696970 66.151515 65.727273 65.606061
Paris Saint-Germain 24.566667 63.133333 68.833333 65.500000 64.500000

특정 하나의 컬럼만 조회하기(Series로 결과 출력됨)
팀별Shotpower평균을 계산하여 평균값이 제일 높은 5개 팀 조회

spByTeam2 = player.groupby('Club')['ShotPower'].mean()
spByTeam2.sort_values(ascending = False).head()
Club
Juventus          68.000000
Ajax              67.400000
Olympiacos CFP    67.000000
SL Benfica        66.714286
Lazio             66.687500
Name: ShotPower, dtype: float64

특정 두 개 이상의 컬럼 조회(DataFrame으로 결과 출력됨)
팀별롱패스와 드리블 능력치 평균값 계산하여 최상위 5개 팀 조회

spByTeam3 = player.groupby('Club')[['LongPassing', 'Dribbling']].mean()
spByTeam3.sort_values(by = 'LongPassing', ascending = False).head()

LongPassing Dribbling
Club
Chelsea 65.787879 65.666667
FC Barcelona 65.727273 66.121212
Manchester United 65.727273 66.878788
Manchester City 65.727273 66.151515
Paris Saint-Germain 65.500000 68.833333

두 개 이상의 변수로 그룹핑(Multi Index로 결과 조회됨)
팀 + 나라로 그룹핑하여 롱패스와 드리블 능력치 평균값 최상위 5개 팀+나라 조회

spByTeam4 = player.groupby(['Nationality','Club'])[['LongPassing', 'Dribbling']].mean()
spByTeam4.sort_values(by= 'LongPassing', ascending = False).head()

LongPassing Dribbling
Nationality Club
Germany Real Madrid 93.0 81.0
Croatia FC Barcelona 90.0 84.0
Denmark Tottenham Hotspur 88.0 84.0
Croatia Real Madrid 88.0 90.0
Argentina FC Barcelona 87.0 97.0

9.1.2 groupby 원리 파헤치기

9.1.2.1 groupby 함수를 이용하면 Groupby 객체가 생성됨

playerGroup = player.groupby('Club')
playerGroup
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x000002211EE1F940>

groupby 객체에서 groups 함수를 이용해 그룹별로 나누어진 값을 dict형태(key와 values)로 확인 가능

playerGroup.groups
{' SSV Jahn Regensburg': Int64Index([ 4587,  4840,  5260,  5335,  6184,  6783,  6917,  6954,  7184,
              7195,  7633,  7657,  7867,  8337,  8933,  9024,  9212, 10285,
              10312, 10686, 11059, 11244, 11861, 12363, 12671, 14161, 14319,
              16105, 17786],
            dtype='int64'),
  '1. FC Heidenheim 1846': Int64Index([ 2053,  4348,  4812,  5093,  5722,  6135,  6208,  6294,  6333,
              6545,  6678,  7595,  7723,  8543,  8567,  9040,  9380,  9535,
              9890, 12004, 12350, 12356, 12654, 14737, 15318, 15842, 16503,
              17538],
            dtype='int64'),
  '1. FC Kaiserslautern': Int64Index([ 5084,  5445,  6372,  7728,  8550,  9335,  9487,  9554,  9563,
              9812,  9886, 10211, 10469, 10554, 11029, 11091, 12485, 14037,
              14758, 15230, 15285, 15392, 15951, 16788, 17268, 17524],
            dtype='int64'),
  ......

9.1.2.2 groupby 객체를 이용해 집계함수 사용

  • 하나의 집계 함수 적용 : groupby객체.집계함수명()
  • 여러개의 집계 함수 적용 : groupby객체.agg([집계함수명1,집계함수명2]) 사용(Multi Column 형태로 출력됨)

groupby 객체의 mean 함수 호출

playerGroup.mean().head()

Age Crossing Dribbling LongPassing ShotPower
Club
SSV Jahn Regensburg 25.655172 47.172414 52.655172 45.689655 54.137931
1. FC Heidenheim 1846 24.000000 49.464286 54.214286 48.964286 57.071429
1. FC Kaiserslautern 23.846154 48.076923 49.769231 48.653846 56.692308
1. FC Köln 24.321429 52.357143 57.964286 54.714286 58.178571
1. FC Magdeburg 24.692308 46.500000 51.346154 47.153846 52.269231
playerGroup.agg(['mean', 'sum']).head()

Age Crossing Dribbling LongPassing ShotPower
mean sum mean sum mean sum mean sum mean sum
Club
SSV Jahn Regensburg 25.655172 744 47.172414 1368.0 52.655172 1527.0 45.689655 1325.0 54.137931 1570.0
1. FC Heidenheim 1846 24.000000 672 49.464286 1385.0 54.214286 1518.0 48.964286 1371.0 57.071429 1598.0
1. FC Kaiserslautern 23.846154 620 48.076923 1250.0 49.769231 1294.0 48.653846 1265.0 56.692308 1474.0
1. FC Köln 24.321429 681 52.357143 1466.0 57.964286 1623.0 54.714286 1532.0 58.178571 1629.0
1. FC Magdeburg 24.692308 642 46.500000 1209.0 51.346154 1335.0 47.153846 1226.0 52.269231 1359.0

9.2 pivot_table 함수

<span class = "hlblock>player.pivot_table(index, columns, values, aggfunc)

  • index : 출력에 사용할 index(그루핑 대상 컬럼)
  • columns : 출력에 사용할 columns
  • values : 집계함수를 적용할 컬럼명
  • aggfunc : 사용할 집계 함수, 여러 개 사용할 경우 [] 안에 집계함수 리스트 작성

EX) 팀별드리블 능력치평균을 구해 상위 5개팀 출력

player.pivot_table(index = 'Club', values = 'Dribbling', aggfunc = 'mean').sort_values(by = 'Dribbling', ascending = False).head()

Dribbling
Club
Juventus 69.520000
Paris Saint-Germain 68.833333
Napoli 68.640000
Liverpool 68.212121
Borussia Dortmund 68.151515

EX2) 나라 + 팀 별로 롱패스와 슟파워평균과 최대값을 계산

player.pivot_table(index = ('Nationality','Club'), values = ('LongPassing','ShotPower'), aggfunc = ('mean','max')).head()

LongPassing ShotPower
max mean max mean
Nationality Club
Afghanistan Notts County 60.0 60.0 60.0 60.0
Philadelphia Union 59.0 59.0 61.0 61.0
SV Meppen 42.0 42.0 39.0 39.0
Walsall 55.0 55.0 55.0 55.0
Albania AC Ajaccio 61.0 61.0 69.0 69.0

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

감사합니다.

반응형
반응형

안녕하세요. PSYda입니다.

Series와 DataFrame을 다루다 보면 각각의 열/행 데이터에 함수를 일괄적으로 적용해야 할 때가 있습니다.

이번 포스팅에서는 Series와 DataFrame의 요소에 함수를 적용하는 방법에 대해 알아보겠습니다.

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

  • Series 각각 요소에 함수 일괄 적용(map함수)
  • DataFrame의 행, 열 별 함수 일괄 적용(apply함수)
  • DataFrame의 요소에 함수 일괄 적용(applymap함수)

8. Series와 DataFrame에 외부 함수 적용하기

  • map 함수 : Series에서 사용하며 모든 요소에 함수 일괄 적용
  • apply 함수 : DataFrame에서 사용하며 각각의 행 또는 열(Series)에 함수 일괄 적용
  • applymap 함수 : DataFrame에서 사용하며 모든 요소에 함수 일괄 적용

8.1 Series의 각각의 요소에 함수 적용하기

map(Function name)

  • Series에서 사용가능한 함수
  • Series의 모든값(values)에 대해 입력된 함수 일괄 적용

pandas library import

import pandas as pd
from pandas import Series , DataFrame
srAge = Series([10,13,15,23,22,36])
srAge
0    10
1    13
2    15
3    23
4    22
5    36
dtype: int64

나이의 범위에 따라 10대, 20대, 30대로 변경하는 함수 생성

  • 10~19 : 10대
  • 20~29 : 20대
  • 30~39 : 30대
  • 그외 : NaN값

으로 변경

def weekday2weeknumber(age):
    if age >= 10 and age < 20:
        ageRange = '10대'
    elif age >= 20 and age < 30:
        ageRange = '20대'
    elif age >= 30 and age < 40:
        ageRange = '30대'
    else:
        ageRange = pd.np.nan
    return ageRange

map 함수로 Series의 각각의 값에 함수 적용

srAgeRange = srAge.map(weekday2weeknumber)
srAgeRange
0    10대
1    10대
2    10대
3    20대
4    20대
5    30대
dtype: object

8.2 DataFrame의 각 열 또는 행에 함수 일괄 적용하기

apply(Function name)

  • DataFrame에서 사용 가능한 함수
  • DataFrame의 행 또는 열에 해당하는 Series에 함수를 일괄 적용

axis 옵션

  • axis = 0(Defualt) : 열기준 함수 적용
  • axis = 1 : 행기준 함수 적용

DataFrame 생성

df = DataFrame([[1,3,5],[4,5,6],[7,8,10]])
df

0 1 2
0 1 3 5
1 4 5 6
2 7 8 10

행 또는 열의 최대값과 최소값의 차이를 구하는 함수 생성

def maxMinusMin(sr):
    return sr.max() - sr.min()
df.apply(maxMinusMin, axis = 0)
0    6
1    5
2    5
dtype: int64
df.apply(maxMinusMin, axis = 1)
0    4
1    2
2    3
dtype: int64

return값을 조정하여 여러개의 열 또는 컬럼으로 출력 가능

def maxMinusMin2(sr):
    sr2 = Series([sr.max(), sr.min(), sr.max()-sr.min()], index = ['최대값','최소값','차이'])
    return sr2
df.apply(maxMinusMin2, axis =0)

0 1 2
최대값 7 8 10
최소값 1 3 5
차이 6 5 5
df.apply(maxMinusMin2, axis =1)

최대값 최소값 차이
0 5 1 4
1 6 4 2
2 10 7 3

8.3 DataFrmae의 각각 요소에 함수 일괄 적용하기

applymap(Function name)

  • DataFrame에서 사용가능한 함수
  • DataFrame의 모든값(values)에 대해 함수 일괄 적용

DataFrame 생성

df2 = DataFrame([[1,1,1],[2,2,2],[3,3,3]])
df2

0 1 2
0 1 1 1
1 2 2 2
2 3 3 3

입력값의 제곱을 리턴하는 함수 생성

def square(x):
    y = x * x
    return y

df2.applymap(square)

0 1 2
0 1 1 1
1 4 4 4
2 9 9 9

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

감사합니다.

반응형
반응형

안녕하세요. PSYda입니다.

이번 포스팅에서는 Pandas DataFrame의 sort(정렬), rank(순위)에 대해 알아보겠습니다.

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

  • DataFrame의 정렬 함수(sort_values, sort_index)
  • DataFrame의 순위 측정 함수(rank)

실습에 사용한 데이터는 fifa19에 등장하는 축구선수들의 능력치 데이터 입니다.
아래에서 다운 받을 수 있습니다.

Ch6_1_fifaStats.csv
다운로드

7. DataFrame의 sort, rank 함수

  • sort 함수 : 데이터를 정렬하는 함수(sort_values, sort_index)
  • rank 함수 : 데이터의 순위를 매기는 함수

7.1 DataFrame의 sort

DataFrame에서는 sort를 index 및 column 기준으로 sort를 할 수 있다.

  • sort_values(axis = 0) : 열방향 정렬(default)
  • sort_values(axis = 1) : 행방향 정렬
  • sort_index(axis = 0) : 인덱스명 정렬(defualt)
  • sort_index(axis = 1) : 컬럼명 정렬

정렬은 ascending 옵션을 통해 오름차순과 내림차순 정렬이 가능하다.

  • ascending = True : 오름차순 정렬, 영어의 경우 a 부터
  • ascending = False : 내림차순 정렬, 영어의 경우 z부터

7.1.1 sort_values() : 열방향 또는 행방향 데이터 정렬

sort_values 함수 옵션

  • ascending = True : True 이면 오름차순, False이면 내림차순 정렬
  • inplace = False : True 이면 정렬한 값을 DataFrame에 바로 반영
  • by : 정렬할 기준 변수 지정
  • na_position = last : NaN값 위치 지정, last이면 마지막, first이면 처음
  • axis = 0 : 0이면 열방향 정렬, 1이면 행방향 정렬

pandas library import

import pandas as pd
from pandas import Series, DataFrame
import numpy as np
players = pd.read_csv('data/Ch6_1_fifaStats.csv', index_col = 'Name')
players.head()

ShortPassing Dribbling LongPassing BallControl
Name
L. Messi 90.0 97.0 87.0 96.0
Cristiano Ronaldo 81.0 88.0 77.0 94.0
Neymar Jr 84.0 96.0 78.0 95.0
De Gea 50.0 18.0 51.0 42.0
K. De Bruyne 92.0 86.0 91.0 91.0

7.1.1.1 by 옵션

DataFrame에서 정렬할 변수를 지정 할 수 있다.(Serise의 경우 한 컬럼이므로 by옵션 설정 필요 없음)

  • axis = 0 이면 컬럼명을 정렬 기준 변수로 지정(default)
  • axis = 1 이면 인덱스명을 정렬 기준 변수로 지정

ShortPassing 능력치 컬럼 기준 오름차순 정렬

players.sort_values(by = 'ShortPassing', axis = 0).head()

ShortPassing Dribbling LongPassing BallControl
Name
Deng Xiaofei 7.0 6.0 12.0 11.0
Zhang Chong 7.0 16.0 9.0 22.0
Cheng Yuelei 8.0 13.0 10.0 18.0
A. Donnarumma 11.0 19.0 11.0 23.0
Gabri Prestão 11.0 18.0 12.0 20.0

7.1.1.2 ascending 옵션

  • True(Default) : 오른차순 정렬
  • False : 내림차순 정렬,

ShortPassing 컬럼 기준 내림차순 정렬

players.sort_values(ascending = False,by = 'ShortPassing').head()

ShortPassing Dribbling LongPassing BallControl
Name
David Silva 93.0 89.0 87.0 94.0
L. Modrić 93.0 90.0 88.0 93.0
T. Kroos 92.0 81.0 93.0 90.0
K. De Bruyne 92.0 86.0 91.0 91.0
C. Eriksen 91.0 84.0 88.0 91.0

7.1.1.3 na_position 옵션

  • 'last'(Defualt) : 결측값(NaN)을 뒤로 정렬
  • 'first' : 결측값(NaN)을 앞으로 정렬

ShortPassing 컬럼 기준 내림차순 정렬하면서 NaN을 처음에 배치

players.sort_values(ascending = False,by = 'ShortPassing', na_position='first').head()

ShortPassing Dribbling LongPassing BallControl
Name
J. McNulty NaN NaN NaN NaN
J. Barrera NaN NaN NaN NaN
J. Stead NaN NaN NaN NaN
A. Semprini NaN NaN NaN NaN
R. Bingham NaN NaN NaN NaN

7.1.1.4 inplace 옵션

  • False(Default) : 정렬된 내용을 단순 출력만함
  • True : 정렬된 내용을 DataFrame에 저장

players DataFrame에 정렬된 데이터를 저장

players.sort_values(ascending = False,by = 'ShortPassing', inplace = True)
players.head()

ShortPassing Dribbling LongPassing BallControl
Name
David Silva 93.0 89.0 87.0 94.0
L. Modrić 93.0 90.0 88.0 93.0
T. Kroos 92.0 81.0 93.0 90.0
K. De Bruyne 92.0 86.0 91.0 91.0
C. Eriksen 91.0 84.0 88.0 91.0

7.1.1.5 axis 옵션

  • axis = 0 : 열방향으로 정렬(위에서 아래로)
  • axis = 1 : 행방향으로 정렬(좌에서 우로)

Index 명의 David Silva 기준으로 행방향 정렬

players.sort_values(axis = 1, by = 'David Silva').head()

LongPassing Dribbling ShortPassing BallControl
Name
David Silva 87.0 89.0 93.0 94.0
L. Modrić 88.0 90.0 93.0 93.0
T. Kroos 93.0 81.0 92.0 90.0
K. De Bruyne 91.0 86.0 92.0 91.0
C. Eriksen 88.0 84.0 91.0 91.0

7.1.2 sort_index() : 인덱스명 정렬

sort_index 함수의 옵션(sort_values 와 옵션이 거의 동일)

  • axis = 0(Default) : index명을 정렬
  • axis = 1 : 컬럼명을 정렬

A 부터 오름차순 정렬

players.sort_index().head()

ShortPassing Dribbling LongPassing BallControl
Name
A. Abang 52.0 56.0 28.0 59.0
A. Abdellaoui 53.0 39.0 45.0 47.0
A. Abdennour 58.0 48.0 62.0 51.0
A. Abdi 74.0 70.0 72.0 74.0
A. Abdu Jaber 49.0 61.0 40.0 59.0

내림차순 정렬

players.sort_index(ascending = False).head()

ShortPassing Dribbling LongPassing BallControl
Name
Óscar Whalley 32.0 16.0 30.0 18.0
Óscar Valentín 68.0 58.0 63.0 68.0
Óscar Plano 68.0 72.0 65.0 73.0
Óscar Pinchi 65.0 69.0 63.0 70.0
Óscar Gil 37.0 57.0 34.0 50.0

컬럼명 정렬

players.sort_index(axis = 1).head()

BallControl Dribbling LongPassing ShortPassing
Name
David Silva 94.0 89.0 87.0 93.0
L. Modrić 93.0 90.0 88.0 93.0
T. Kroos 90.0 81.0 93.0 92.0
K. De Bruyne 91.0 86.0 91.0 92.0
C. Eriksen 91.0 84.0 88.0 91.0

7.2 DataFrame의 rank

rank 함수 (데이터의 순위를 측정) 옵션

  • ascending : False 이면 숫자가 큰 것이 순위가 높음(rank 값이 작음)
  • axis : 0이면 열방향, 1이면 행방향으로 순위 측정
  • method : 동점인 경우 순위 측정에 사용할 방법(평균, 최소값, 최대값 등)
  • pct : True 이면 상위 몇% 인지 보여줌

7.2.1 ascending 옵션

  • True(Default) : 데이터 수치가 클 수록 rank값이 커짐(순위가 낮아짐)
  • False : 데이터 수치가 작을 수록 rank값이 작아짐(순위가 높아짐)

컬럼별로 순위 측정(데이터 수치가 클수록 rank가 높음)

players.rank().head()

ShortPassing Dribbling LongPassing BallControl
Name
David Silva 18158.5 18131.5 18145.0 18155.0
L. Modrić 18158.5 18141.5 18150.5 18152.5
T. Kroos 18156.5 17790.5 18159.0 18137.5
K. De Bruyne 18156.5 18061.0 18158.0 18145.0
C. Eriksen 18155.0 17982.5 18150.5 18145.0
players.rank(ascending = False).head()

ShortPassing Dribbling LongPassing BallControl
Name
David Silva 1.5 28.5 15.0 5.0
L. Modrić 1.5 18.5 9.5 7.5
T. Kroos 3.5 369.5 1.0 22.5
K. De Bruyne 3.5 99.0 2.0 15.0
C. Eriksen 5.0 177.5 9.5 15.0

7.2.2 axis 옵션

  • axis = 0(Defualt) : 열방향으로 순위 측정
  • axis = 1 : 행방향으로 순위 측정

행방향으루 순위 측정(David Silva의 경우 BallControl 컬럼의 순위가 가장 높음)

players.rank(ascending = False, axis = 1).head()

ShortPassing Dribbling LongPassing BallControl
Name
David Silva 2.0 3.0 4.0 1.0
L. Modrić 1.5 3.0 4.0 1.5
T. Kroos 2.0 4.0 1.0 3.0
K. De Bruyne 1.0 4.0 2.5 2.5
C. Eriksen 1.5 4.0 3.0 1.5

7.2.3 method 옵션

데이터 수치가 동점일 경우 순위 측정 방법

  • average(Default) : 평균으로 순위 측정( Ex. 1위가 2명인경우 1.5 )
  • first : 동점없이 정렬된 순서대로 순위 측정( Ex. 1위가 3명인 경위 위에서부터 1,2,3 )
  • max : 동점인 데이터들 중 순위가 낮은 값 선정( Ex. 1위가 3명인 경우 3 )
  • min : 동점인 데이터들 중 순위가 높은 값 선정( Ex. 1위가 3명인 경우 1등, 4번째 데이터의 경우 4등 )
  • dense : min과 비슷하지만 동점 다음 데이터 순위 측정에서 차이가 있음( Ex. 1위가 3명인 경우 1등, 4번째 데이터의 경우 2등 )

순위가 동점이면 평균값 측정(David Silva와 L.Modric이 공동 1등이므로 1.5값 부여)

players.rank(ascending = False, method = 'average').head()

ShortPassing Dribbling LongPassing BallControl
Name
David Silva 1.5 28.5 15.0 5.0
L. Modrić 1.5 18.5 9.5 7.5
T. Kroos 3.5 369.5 1.0 22.5
K. De Bruyne 3.5 99.0 2.0 15.0
C. Eriksen 5.0 177.5 9.5 15.0
players.rank(ascending = False, method = 'first').head()

ShortPassing Dribbling LongPassing BallControl
Name
David Silva 1.0 25.0 11.0 4.0
L. Modrić 2.0 13.0 9.0 7.0
T. Kroos 3.0 332.0 1.0 18.0
K. De Bruyne 4.0 80.0 2.0 13.0
C. Eriksen 5.0 153.0 10.0 14.0
players.rank(ascending = False, method = 'max').head()

ShortPassing Dribbling LongPassing BallControl
Name
David Silva 2.0 32.0 19.0 6.0
L. Modrić 2.0 24.0 10.0 8.0
T. Kroos 4.0 407.0 1.0 27.0
K. De Bruyne 4.0 118.0 2.0 17.0
C. Eriksen 5.0 202.0 10.0 17.0
players.rank(ascending = False, method = 'min').head()

ShortPassing Dribbling LongPassing BallControl
Name
David Silva 1.0 25.0 11.0 4.0
L. Modrić 1.0 13.0 9.0 7.0
T. Kroos 3.0 332.0 1.0 18.0
K. De Bruyne 3.0 80.0 2.0 13.0
C. Eriksen 5.0 153.0 9.0 13.0
players.rank(ascending = False, method = 'dense').head()

ShortPassing Dribbling LongPassing BallControl
Name
David Silva 1.0 9.0 6.0 3.0
L. Modrić 1.0 8.0 5.0 4.0
T. Kroos 2.0 17.0 1.0 7.0
K. De Bruyne 2.0 12.0 2.0 6.0
C. Eriksen 3.0 14.0 5.0 6.0

7.2.4 pct 옵션

  • False(Default) : rank를 순위(숫자)로 매김
  • True : 순위의 퍼센테이지값으로 매김(ex. 4명 중 1등인 경우 0.25, 4등은 1.0)

players 데이터 확인

players.head()

ShortPassing Dribbling LongPassing BallControl
Name
David Silva 93.0 89.0 87.0 94.0
L. Modrić 93.0 90.0 88.0 93.0
T. Kroos 92.0 81.0 93.0 90.0
K. De Bruyne 92.0 86.0 91.0 91.0
C. Eriksen 91.0 84.0 88.0 91.0

행방향으로 퍼센테이지 순위 측정(David Silva의 경우 BallControl이 1등이므로 0.25)

players.rank(ascending = False, axis = 1, pct = True).head()

ShortPassing Dribbling LongPassing BallControl
Name
David Silva 0.500 0.75 1.000 0.250
L. Modrić 0.375 0.75 1.000 0.375
T. Kroos 0.500 1.00 0.250 0.750
K. De Bruyne 0.250 1.00 0.625 0.625
C. Eriksen 0.375 1.00 0.750 0.375

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

감사합니다.

반응형
반응형

안녕하세요. PSYda입니다.

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

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

  • DataFrame의 통계 함수 소개(주요통계량 출력, 평균, 표준편차, 최대/최소값, 상관계수 등)
  • DataFame의 통계에 대한 시각화(히스토그램, 상관관계)

실습에 사용한 데이터는 fifa19에 등장하는 선술들의 능력치 데이터 입니다.
아래에서 다운로드 받을 수 있습니다.

Ch6_1_fifaStats.csv
다운로드

6.Pandas DataFrame 통계

DataFrame의 주요한 통계 함수는 아래와 같습니다.

  • Describe : 전체 주요 통계량 출력
  • sum : 합계 출력
  • cumsum : 누적합계 출력
  • mean : 평균값 출력
  • Std : 표준 편차 출력
  • var : 분산 출력
  • median : 중앙값 출력
  • count : 데이터 개수 출력
  • min, max, idxmin, idxmax : 최소값,최대값,최소값의 index, 최대값의 index 출력
  • corr, cov : 상관계수, 공분산 출력

위의 통계 함수를 비롯한 대부분의 함수에서 axis 옵션을 이용해 사용할 축을 설정할 수 있습니다.

  • axis = 0 : 열방향으로 통계량 산출(Default)
  • axis = 1 : 행방향으로 통계량 산출

실습을 위해 Fifa19 선수들의 Stat 정보를 Load

import pandas as pd
from pandas import Series, DataFrame
import numpy as np
players = pd.read_csv('data/Ch6_1_fifaStats.csv', index_col = 'Name')
players.head()

ShortPassing Dribbling LongPassing BallControl
Name
L. Messi 90.0 97.0 87.0 96.0
Cristiano Ronaldo 81.0 88.0 77.0 94.0
Neymar Jr 84.0 96.0 78.0 95.0
De Gea 50.0 18.0 51.0 42.0
K. De Bruyne 92.0 86.0 91.0 91.0

6.1 전체 통계량 요약 보기(describe)

describe 함수 : 컬럼별 전체 통계량을 요약해서 볼 수 있음

  • 데이터 개수, 평균, 표준편차, 최소값, 4분위값, 최대값 출력
  • 숫자형 컬럼만 통계량을 출력함

decribe 함수 호출

players.describe()

ShortPassing Dribbling LongPassing BallControl
count 18159.000000 18159.000000 18159.000000 18159.000000
mean 58.686712 55.371001 52.711933 58.369459
std 14.699495 18.910371 15.327870 16.686595
min 7.000000 4.000000 9.000000 5.000000
25% 54.000000 49.000000 43.000000 54.000000
50% 62.000000 61.000000 56.000000 63.000000
75% 68.000000 68.000000 64.000000 69.000000
max 93.000000 97.000000 93.000000 96.000000

6.2 함수별 통계량 보기

6.2.1 sum():합계 출력

players.sum()
ShortPassing    1065692.0
Dribbling       1005482.0
LongPassing      957196.0
BallControl     1059931.0
dtype: float64

6.2.2 cumsum():누적합계 출력

# 선수별 능력치 누적 합계 출력
players.head().cumsum(axis = 1)

ShortPassing Dribbling LongPassing BallControl
Name
L. Messi 90.0 187.0 274.0 370.0
Cristiano Ronaldo 81.0 169.0 246.0 340.0
Neymar Jr 84.0 180.0 258.0 353.0
De Gea 50.0 68.0 119.0 161.0
K. De Bruyne 92.0 178.0 269.0 360.0

6.2.3 mean(): 평균값 출력

Stat별 평균(컬럼 기준)

players.mean()
ShortPassing    58.686712
Dribbling       55.371001
LongPassing     52.711933
BallControl     58.369459
dtype: float64

선수별 평균(행 기준)

players.mean(axis=1).head()
Name
L. Messi             92.50
Cristiano Ronaldo    85.00
Neymar Jr            88.25
De Gea               40.25
K. De Bruyne         90.00
dtype: float64

6.2.4 std(): 표준편차 출력

players.std()
ShortPassing    14.699495
Dribbling       18.910371
LongPassing     15.327870
BallControl     16.686595
dtype: float64

6.2.5 var():분산 출력

players.var()
ShortPassing    216.075157
Dribbling       357.602135
LongPassing     234.943613
BallControl     278.442466
dtype: float64
```text


### 6.2.6 median():중앙값 출력


```python
players.median()
ShortPassing    62.0
Dribbling       61.0
LongPassing     56.0
BallControl     63.0
dtype: float64

6.2.7 count() : 데이터 개수 출력

players.count()
ShortPassing    18159
Dribbling       18159
LongPassing     18159
BallControl     18159
dtype: int64

6.2.8 max(), min() : 최대값, 최소값 출력

players.max()
ShortPassing    93.0
Dribbling       97.0
LongPassing     93.0
BallControl     96.0
dtype: float64
players.min()
ShortPassing    7.0
Dribbling       4.0
LongPassing     9.0
BallControl     5.0
dtype: float64

6.2.9 idxmin(), idxmax():최대값,최소값에 해당하는 인덱스 출력

선수별 가장 낮은 능력치는?

players.idxmin(axis = 1).head()
Name
L. Messi             LongPassing
Cristiano Ronaldo    LongPassing
Neymar Jr            LongPassing
De Gea                 Dribbling
K. De Bruyne           Dribbling
dtype: object

스탯별 최고의 선수는?

players.idxmax()
ShortPassing    L. Modrić
Dribbling        L. Messi
LongPassing      T. Kroos
BallControl      L. Messi
dtype: object

6.2.10 corr(), cov(): 상관계수, 공분산 출력

전체 컬럼별 상관계수 행렬 출력

corr_mat = players.corr()
corr_mat

ShortPassing Dribbling LongPassing BallControl
ShortPassing 1.000000 0.843722 0.895722 0.911451
Dribbling 0.843722 1.000000 0.722465 0.938942
LongPassing 0.895722 0.722465 1.000000 0.788650
BallControl 0.911451 0.938942 0.788650 1.000000

특정 컬럼과 상관도가 높은 순서대로 출력

corr_mat['ShortPassing'].sort_values(ascending = False)
ShortPassing    1.000000
BallControl     0.911451
LongPassing     0.895722
Dribbling       0.843722
Name: ShortPassing, dtype: float64

전체 컬럼별 공분산 행렬 출력

cov_mat = players.cov()
cov_mat

ShortPassing Dribbling LongPassing BallControl
ShortPassing 216.075157 234.531811 201.816840 223.564867
Dribbling 234.531811 357.602135 209.410657 296.282958
LongPassing 201.816840 209.410657 234.943613 201.712999
BallControl 223.564867 296.282958 201.712999 278.442466

특정 컬럼과 공분산이 낮은 순서대로 출력

cov_mat['Dribbling'].sort_values(ascending = True)
LongPassing     209.410657
ShortPassing    234.531811
BallControl     296.282958
Dribbling       357.602135
Name: Dribbling, dtype: float64

6.3 통계량 시각화하기

6.3.1 histogram 시각화

players.hist(figsize = (15,10))
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x0000020A6CA2E6A0>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000020A6CA2D898>],
        [<matplotlib.axes._subplots.AxesSubplot object at 0x0000020A6C860080>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000020A6C8872E8>]],
      dtype=object)

6.3.2 상관계수 그래프 시각화

pd.plotting.scatter_matrix(players, figsize = (15,10))
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x0000020A6E38F1D0>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000020A6E6F50B8>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000020A6E3D6358>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000020A6E3FD898>],
        [<matplotlib.axes._subplots.AxesSubplot object at 0x0000020A6E426E10>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000020A6E4573C8>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000020A6E47F940>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000020A6E4A8EF0>],
        [<matplotlib.axes._subplots.AxesSubplot object at 0x0000020A6E4A8F28>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000020A6E4FE9E8>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000020A6E525F60>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000020A6E556518>],
        [<matplotlib.axes._subplots.AxesSubplot object at 0x0000020A6E580A90>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000020A6E5B2048>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000020A6E5D95C0>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000020A6E601B38>]],
      dtype=object)

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

감사합니다.

반응형
반응형

안녕하세요. PSYda입니다.

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

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

  • DataFrame과 DataFrame의 연산 함수 소개
  • DataFrame과 Sereis의 연산 함수 소개

5.Pandas DataFrame 산술 연산

DataFrame 의 연산은 아래의 두 가지 케이스가 있습니다.

  • DataFrame vs DataFrame 연산
  • DataFrame vs Series 연산

5.1 DataFrame vs DataFrame 연산

DataFrame의 연산 규칙은 아래와 같습니다.

  • 같은 index 이면서 같은 column 명을 가진 두 value를 연산함
  • 같은 index 이면서 같은 column 명을 가진 두 value 중 하나라도 NaN이 있으면 NaN으로 채워진다.
  • index나 column 명이 다르면 NaN으로 채워진다.

연산하는 방법에는 두 가지 방법이 있습니다.

  • 연산자( +, -, *, / )를 이용한 연산
  • 함수( add, sub, mul, div )를 이용한 연산

기본 연산은 동일하지만 함수를 사용하면 fill_valueaxis 옵션을 사용할 수 있습니다.

Ex)df1.add(df2, fill_value = 0, axis = 0)

  • fill_value = 0 : NaN값을 0으로 간주하고 연산, 0이 아닌 값 입력 가능
  • axis = 0 : DataFrame와 Series간의 연산에서 방향을 지정(5.1.2 참고)

곱하기, 나누기, 빼기 등도 동일한 방법이므로, 대표로 더하기에 대해서만 실습해보겠습니다.

import pandas as pd
from pandas import Series, DataFrame
import numpy as np
df1 = DataFrame([[1,3,5],[7,9,11],[5,13,15]])
df1

0 1 2
0 1 3 5
1 7 9 11
2 5 13 15
df2 = DataFrame([[1,2,3],[4,np.nan,6],[7,8,9]], columns=[0,1,3], index=[0,1,3])
df2

0 1 3
0 1 2.0 3
1 4 NaN 6
3 7 8.0 9
df1 + df2

0 1 2 3
0 2.0 5.0 NaN NaN
1 11.0 NaN NaN NaN
2 NaN NaN NaN NaN
3 NaN NaN NaN NaN
df1.add(df2,fill_value=0)

0 1 2 3
0 2.0 5.0 5.0 3.0
1 11.0 9.0 11.0 6.0
2 5.0 13.0 15.0 NaN
3 7.0 8.0 NaN 9.0

5.2 DataFrame vs Series 연산

연산 함수(add, sub, mul, div) 의 axis 옵션을 통해 행, 열 방향으로 연산 가능

Ex) df1.add(df2, axis = 0)

axis = 0 : Index방향(행방향)으로 DataFrame과 Series 연산

  • DataFrame과 Series가 동일한 Index를 가지면 연산, 다르면거나 한쪽만 있으면 NaN

axis = 1 : Column방향으로 DataFrame과 Series 연산

  • DataFrame과 Series가 동일한 Column명을 가지면 연산, 다르면거나 한쪽만 있으면 NaN

연산을 위한 Sereis 생성

s1 = Series([1,2,3,4])
s1
0    1
1    2
2    3
3    4
dtype: int64
df1

0 1 2
0 1 3 5
1 7 9 11
2 5 13 15
df1.add(s1, axis = 0)

0 1 2
0 2.0 4.0 6.0
1 9.0 11.0 13.0
2 8.0 16.0 18.0
3 NaN NaN NaN
df1.add(s1, axis = 1)

0 1 2 3
0 2 5 8 NaN
1 8 11 14 NaN
2 6 15 18 NaN

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

다음 포스팅은 DataFrame의 통계에 대해 알아볼 예정입니다.

감사합니다.

반응형
반응형

안녕하세요. PSYda입니다.

이번 포스팅에서는 Pandas 데이터의 파일 입출력 방법에 대해 알아보겠습니다.

실습에 필요한 파일은 아래에서 다운로드 받을 수 있습니다.

data.zip
다운로드

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

  • 텍스트 파일 입력을 위한 read_csv 함수 소개
  • 엑셀 파일 입력을 위한 read_excel 함수 소개
  • DataFrame의 텍스트 파일 출력을 위한 to_csv 함수 소개
  • DataFrame의 엑셀 파일 출력을 위한 to_excel 함수 소개

4. Pandas 파일 입출력

Pandas로 입출력 할 수 있는 파일 포맷은 매우 다양하지만 대표적으로 아래와 같습니다.

  • CSV, Excel, HTML, JSON 등

이번에는 CSV 및 Excel File을 입출력하는 방법을 알아보겠습니다.

예제에 사용하기 위한 데이터를 확보하기 위해 kaggle에서 fifa19 선수 Dataset을 다운로드 받았으며, 실습에 사용하기 위해 변형하였습니다.

4.1 파일 입력

4.1.1 (구분자가 있는)텍스트 파일 및 CSV 파일 읽기

Pandas에서 read_csv 함수를 이용하여 텍스트 파일 및 CSV 파일을 읽을 수 있으며, 읽은 데이터는 DataFrame형태로 저장됩니다.
read_csv 함수 사용법은 아래와 같습니다.

pd.read_csv(FilePath, sep, header, names, index_col, skiprows, nrows, encoding, comment, chunksize)

  • FilePath : 읽을 파일 Path, URL 도 가능
  • sep : 구분자 입력, Default 는 쉼표(',')
  • header : 파일의 데이터에 header가 없을 경우 none 입력, Default는 header 읽음
  • names : 파일의 데이터에 header가 없을 경우에 명시적으로 컬럼명 입력 가능
  • skiprows : 입력한 개수 만큼 파일에서 행을 건너뛰고 읽음
  • index_col : 명시한 특정 컬럼을 index로 사용
  • nrows : 파일 최상위에서부터 입력한 개수만큼의 데이터만 읽음
  • encoding : 파일의 문자 인코딩 타입 입력, 한글이면 'CP949'
  • comment : 특정 문자는 주석으로 간주하고 읽지 않음
  • chunksize : TextFileReader가 입력받을 데이터 개수 Return하여 특정 개수 만큼 순서대로 읽음(뒤에 예시 참고)

pandas libary를 import

import pandas as pd
from pandas import Series, DataFrame

4.1.1.1 read_csv(별도 옵션 없이)

  • 일반 text 파일 또는 csv을 읽어서 DataFrame에 저장
  • 쉼표(',')를 기준으로 Data를 나누고 읽음

별도의 설정 없이 csv File 읽기

fifa19Player = pd.read_csv("data/Ch4_1_fifa.csv")
fifa19Player.head(5)

Index ID Name Age
0 0 158023 L.Messi 31
1 1 20801 CristianoRonaldo 33
2 2 190871 NeymarJr 26
3 3 193080 DeGea 27
4 4 192985 K.DeBruyne 27

4.1.1.2 sep 옵션

  • 공백, 탭, 다른 기호 등으로 데이터가 분리된 파일일 경우 사용
  • 공백의 경우 정규식 '\s+' 을 사용함(공백이 하나 이상 발생한 경우 구분하는 정규식)

구분자를 공백으로 주고 csv File 읽기

data1 = pd.read_csv('data/Ch4_2_sep.txt', sep='\s+')
data1

Index ID Name Age
0 0 158023 L.Messi 31
1 1 20801 CristianoRonaldo 33
2 2 190871 NeymarJr 26
3 3 193080 DeGea 27
4 4 192985 K.DeBruyne 27

4.1.1.3 header 옵션

  • Default 값은 첫 행을 Header로 간주
  • 첫 행이 Header가 아닐 경우 None 을 입력해주면, 첫 행도 데이터로 저장
  • 왼쪽부터 0부터 순서대로 컬럼명 부여

header가 없는 File 읽기

data2 = pd.read_csv('data/Ch4_3_header.txt', sep='\s+', header = None)
data2

0 1 2 3
0 0 158023 L.Messi 31
1 1 20801 CristianoRonaldo 33
2 2 190871 NeymarJr 26
3 3 193080 DeGea 27
4 4 192985 K.DeBruyne 27

4.1.1.4 names 옵션

  • 첫 행이 Header가 아닐 경우 명시적으로 컬럼명 입력 가능

header가 없응 File 읽을 때 컬럼명 명시

data3 = pd.read_csv('data/Ch4_3_header.txt', sep='\s+', names = ['Index', 'ID', 'Player', 'Age'])
data3

Index ID Player Age
0 0 158023 L.Messi 31
1 1 20801 CristianoRonaldo 33
2 2 190871 NeymarJr 26
3 3 193080 DeGea 27
4 4 192985 K.DeBruyne 27

4.1.1.5 skiprosw 옵션

  • 읽고 싶지 않은 행(MetaData 등)을 제외 할 수 있음
  • 특정 행을 읽는데 에러가 생기는 경우 제외 할 수 있음

특정 행을 제외하고 파일 읽기

data4 = pd.read_csv("data/Ch4_4_skiprows.txt", sep='\s+', skiprows = [0,1], header = None)
data4

0 1 2 3
0 0 158023 L.Messi 31
1 1 20801 CristianoRonaldo 33
2 2 190871 NeymarJr 26
3 3 193080 DeGea 27
4 4 192985 K.DeBruyne 27

4.1.1.6 index_col 옵션

  • 특정 컬럼명을 Index열로 저장

index 컬럼을 Index로 설정

data5 = pd.read_csv('data/Ch4_5_index_col.txt', index_col = 'Index')
data5

ID Name Age
Index
0 158023 L.Messi 31
1 20801 CristianoRonaldo 33
2 190871 NeymarJr 26
3 193080 DeGea 27
4 192985 K.DeBruyne 27

4.1.1.7 nrows 옵션

  • 위에서부터 입력한 개수 만큼의 데이터만 읽음
  • 데이터량이 많아 메모리에 문제가 예상될 때 사용 할 수 있음

3개의 row만 읽기

data6= pd.read_csv('data/Ch4_5_index_col.txt', nrows = 3)
data6

Index ID Name Age
0 0 158023 L.Messi 31
1 1 20801 CristianoRonaldo 33
2 2 190871 NeymarJr 26

4.1.1.8 encoding 옵션

  • 데이터 encoding 이 맞지 않아 문자가 깨지거나 오류가 생길 때 설정
  • 한글의 경우 'CP949' 를 적용하면 깨지지 않음

CP949 encoding 적용!

data7= pd.read_csv('data/Ch4_6_encoding.txt', encoding = 'CP949')
data7

Index ID 이름 나이
0 0 158023 L.Messi 31
1 1 20801 CristianoRonaldo 33
2 2 190871 NeymarJr 26
3 3 193080 DeGea 27
4 4 192985 K.DeBruyne 27

4.1.1.9 comment 옵션

  • 특정 문자가 있는 행은 주석으로 간주하고 읽지 않고 건너뜀

'/' 문자는 주석이므로 읽기 않음

data5 = pd.read_csv('data/Ch4_5_comment.txt', comment = '/')
data5

Index ID Name Age
0 0 158023 L.Messi 31
1 1 20801 CristianoRonaldo 33
2 2 190871 NeymarJr 26
3 3 193080 DeGea 27
4 4 192985 K.DeBruyne 27

4.1.1.10 chunksize 옵션

  • 특정 개수만큼 순서대로 입력 받을 수 있는 TextFileReader 객체를 생성
  • next(TextFileReader객체) 구문을 이용해 특정 개수만큼 순서대로 데이터 입력
  • 데이터량이 많아서 한번에 불러올 수 없는 경우에 사용

2개씩 데이터 입력

TextFileReader = pd.read_csv('data/Ch4_1_fifa.csv', chunksize = 2)
next(TextFileReader)

Index ID Name Age
0 0 158023 L.Messi 31
1 1 20801 CristianoRonaldo 33
# 한번 더 하면 그 다음 500개 가 순서대로 출력
next(TextFileReader)

Index ID Name Age
2 2 190871 NeymarJr 26
3 3 193080 DeGea 27

4.1.2 Excel 파일 읽기

read_excel 함수를 이용하여 excel 파일을 읽어 올 수 있으며 대부분의 옵션들은 read_csv와 동일합니다.

자주 사용되는 옵션들 위주로 알아보겠습니다.

read_excel(Path, sheet_name)

  • Path : excel 파일 경로
  • sheet_name : 읽을 Sheet name 명시

4.1.2.1 read_excel(별도 옵션 없이)

fifa = pd.read_excel('data/Ch4_9_fifa19.xlsx')
fifa

Unnamed: 0 ID Name Age
0 0 158023 L. Messi 31
1 7 176580 L. Suárez 31
2 18 192448 M. ter Stegen 26
3 20 189511 Sergio Busquets 29
4 32 189242 Coutinho 26

4.1.2.2 sheet_name

  • 명시한 Sheet name만 읽음
  • Default는 첫 번째 Sheet
  • None을 입력하면 모든 Sheet를 key = Sheetname, value = Data 로 가져옴

Tottenham sheet 읽기

Tottenham = pd.read_excel('data/Ch4_9_fifa19.xlsx', sheet_name = 'Tottenham')
Tottenham

Unnamed: 0 ID Name Age
0 16 202126 H. Kane 24
1 31 190460 C. Eriksen 26
2 37 167948 H. Lloris 31
3 125 200104 H. Son 25
4 71 184087 T. Alderweireld 29
AllTeam = pd.read_excel('data/Ch4_9_fifa19.xlsx', sheet_name = None)
AllTeam.keys()
odict_keys(['FCBarcelona', 'Tottenham', 'ManUnited'])
AllTeam['ManUnited']

Unnamed: 0 ID Name Age
0 3 193080 De Gea 27
1 45 195864 P. Pogba 25
2 47 192505 R. Lukaku 25
3 93 184941 A. Sánchez 29
4 116 211300 A. Martial 22

한번에 세 개의 팀을 저장 할 수도 있음

Barcelona, Tottenham, ManUTD = AllTeam.values()
Tottenham

Unnamed: 0 ID Name Age
0 16 202126 H. Kane 24
1 31 190460 C. Eriksen 26
2 37 167948 H. Lloris 31
3 125 200104 H. Son 25
4 71 184087 T. Alderweireld 29

4.2 파일 출력

파일 입력과 마찬가지로 Pandas는 다양한 데이터로의 출력을 지원하지만 가장 많이 사용하는 csv, excel 에 관해서만 알아보겠습니다.

4.2.1 (구분자가 있는)텍스트 파일 및 CSV 로 출력

Pandas에서는 DataFame 데이터를 to_csv 함수를 이용하여 텍스트 파일 및 CSV 파일로 출력할 수 있습니다.

to_csv도 read_csv와 비슷한 옵션들을 가지고 있기 떄문에, 옵션에 대한 설명은 넘어가도록 하겠습니다.

Tottenham.to_csv('data/Tottenham.csv')

4.2.2 Excel 로 출력

to_excel 함수를 이용해 DataFrame 데이터를 Excel 파일로 출력할 수 있습니다.

마찬가지로 옵션에 대한 설명은 넘어가도록 하겠습니다.

ManUTD.to_excel('data/ManUTD.xlsx')

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

감사합니다.

반응형
반응형

안녕하세요. PSYda 입니다.

이번 포스팅에서는 두 개의 DataFrame을 연결하는 Join 기법에 대해 알아보겠습니다.

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

  • 컬럼 기준 Join
  • Index 기준 Join
  • 행기준 Join
  • Inner, Left, Right ,Outer Join

3. DataFrame Join

Join 이란?

  • 두 개의 DataFrame을 합치는 것
  • 열기준 컬럼명으로 합치기 : merge
  • 열기준 Index명로 합치기 : merge, concat
  • 행기준으로 합치기 : concat, append

합치는 방법은?

  • Inner : 두 DataFrame의 기준 컬럼에서 둘 다 존재하는 데이터만 Join
  • Left Outer join : 왼쪽 DataFrame으로 합치기
  • Right Outer Join : 오른쪽 DataFrame으로 합치기
  • Outer Join : 두 DataFrame의 모든 Data를 합치기

Merge 명령어 사용법?

  • pd.merge(left, right, how, on, left_on, right_on, left_index, right_index)
  • left : Merge 할 왼쪽 DataFrame
  • right : Merge 할 오른쪽 DataFrame
  • how : inner, left, right, outer
  • on : 두 DataFrame을 Join할 기준 컬럼명(컬럼명이 동일할 경우)
  • left_on : Join할 기준 컬럼의 왼쪽 DataFrame의 컬럼명
  • right_on : Join할 기준 컬럼의 오른쪽 DataFrame의 컬럼명
  • left_index : 왼쪽 DataFrame index로 Join할 경우 True
  • right_index : 오른쪽 DataFrame index로 Join할 경우 True

concat 명령어 사용법?

  • pd.concat([left,right], axis, join,...)
  • [left,right] : left DataFrame과 right DataFrame으로 이루어진 List
  • axis = 0 : 행기준으로 합치기, 1: 열기준으로 Index명으로 합치기

pandas libary를 import 합니다.

import pandas as pd
from pandas import Series, DataFrame

3.1 같은 Column끼리 합치기

DF1 = DataFrame([["싸이",180,75],["덕구",160,65],["또치",170,75]], columns = ["이름","키","몸무게"])
DF1

이름 몸무게
0 싸이 180 75
1 덕구 160 65
2 또치 170 75
DF2 = DataFrame([["싸이","포워드","잘함"],["덕구","미드필더","못함"],["똥갈","수비수","잘함"]], columns = ["이름","포지션","실력"])
DF2

이름 포지션 실력
0 싸이 포워드 잘함
1 덕구 미드필더 못함
2 똥갈 수비수 잘함

3.1.1 Inner Join

두 DataFrame의 기준 컬럼에서 둘 다 존재하는 데이터만 Join

pd.merge(left = DF1 , right = DF2, how = "inner", on = "이름")

이름 몸무게 포지션 실력
0 싸이 180 75 포워드 잘함
1 덕구 160 65 미드필더 못함

3.1.2 Left Outer Join

  • 왼쪽 DataFrame의 모든 데이터 출력 +
  • 오른쪽 DataFrame 중 왼쪽 DataFrame에 있는 Data는 출력
  • 오른쪽 DataFrame 중 왼쪽 DataFrame에 없는 Data는 NaN으로 처리

pd.merge(left = DF1 , right = DF2, how = "left", on = "이름")

몸무게 포지션 실력
이름
싸이 180 75 포워드 잘함
덕구 160 65 미드필더 못함
또치 170 75 NaN NaN

3.1.3 Right Outer Join

  • 오른쪽 DataFrame의 모든 데이터 출력 +
  • 왼쪽 DataFrame 중 오른쪽 DataFrame에 있는 Data는 출력
  • 왼쪽 DataFrame 중 오른쪽 DataFrame에 없는 Data는 NaN으로 처리

pd.merge(left = DF1 , right = DF2, how = "right", on = "이름")

이름 몸무게 포지션 실력
0 싸이 180.0 75.0 포워드 잘함
1 덕구 160.0 65.0 미드필더 못함
2 똥갈 NaN NaN 수비수 잘함

3.1.4 Outer Join

  • 왼쪽, 오른쪽 DataFrame의 모든 데이터 출력 +
  • 왼쪽 DataFrame 중 오른쪽 DataFrame에 있는 Data는 NaN으로 처리
  • 오른쪽 DataFrame 중 왼쪽 DataFrame에 없는 Data는 NaN으로 처리

DF1과 DF2를 Outer Join

pd.merge(left = DF1 , right = DF2, how = "outer", on = "이름")

이름 몸무게 포지션 실력
0 싸이 180.0 75.0 포워드 잘함
1 덕구 160.0 65.0 미드필더 못함
2 또치 170.0 75.0 NaN NaN
3 똥갈 NaN NaN 수비수 잘함

3.2 같은 Index 기준으로 합치기

  • set_index("컬럼명") : 컬럼명의 데이터가 Index로 설정, 컬럼데이터는 삭제
DF1 = DF1.set_index("이름")
DF1

몸무게
이름
싸이 180 75
덕구 160 65
또치 170 75
DF2 = DF2.set_index("이름")
DF2

포지션 실력
이름
싸이 포워드 잘함
덕구 미드필더 못함
똥갈 수비수 잘함
pd.merge(left = DF1, right = DF2, left_index = True, right_index = True, how = "inner")

몸무게 포지션 실력
이름
싸이 180 75 포워드 잘함
덕구 160 65 미드필더 못함
pd.concat([DF1,DF2],axis = 1, join = 'inner')

몸무게 포지션 실력
이름
싸이 180 75 포워드 잘함
덕구 160 65 미드필더 못함

3.3 행기준으로 합치기

  • 같은 컬럼명이 존재하면, 데이터 저장
  • 다른 컬럼명이 존재하면, 해당 컬럼이 있는 DataFrame은 데이터 저장, 없는 DataFrame은 NaN 처리
  • 일반적으로 concat보다 append가 더 빠름
DF3 = DataFrame([[187, 80, 30], [190,85, 20]], columns = ["키","몸무게","나이"], index = ["거북이","깜디"])
DF3

몸무게 나이
거북이 187 80 30
깜디 190 85 20
DF1.append(DF3, sort=False)

몸무게 나이
싸이 180 75 NaN
덕구 160 65 NaN
또치 170 75 NaN
거북이 187 80 30.0
깜디 190 85 20.0
pd.concat([DF1, DF3], axis = 0, sort=False)

몸무게 나이
싸이 180 75 NaN
덕구 160 65 NaN
또치 170 75 NaN
거북이 187 80 30.0
깜디 190 85 20.0

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

다음 포스팅은 Pandas 데이터의 파일 입출력에 대해 알아볼 예정입니다.

감사합니다.

반응형
반응형

안녕하세요. 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에서도 확인 할 수 있습니다.
감사합니다.

반응형
반응형

안녕하세요. PSYda입니다.
오늘은 Pandas가 무엇인지 알아보겠습니다.

1. Pandas란?

Pandas의 공식 Github에서 설명하는 Pandas는 아래와 같습니다.

 

"관계형" 또는 "레이블이 된" 데이터로 쉽고 직관적으로 작업할 수 있도록 설계되었고 빠르고, 유연한 데이터 구조를 제공하는 Python 패키지

 

관계형, 레이블이 된 데이터라는 말은 엑셀의 데이터나, DBMS의 관계형 테이블 형태와 같은 표형태의 데이터로 이해 할 수 있습니다. 아무튼 데이터를 쉽게 다룰 수 있고, 분석을 용이하게 해주는 파이썬 라이브러리라고 이해 할 수 있습니다.

2. Pandas로 할 수 있는 것은?

구체적으로 Pandas로 할 수 있는 것들은 아래와 같습니다.

  • Python 자료구조와의 호환(List ,Tuple, Dict, NumpyArray 등)
  • 큰 데이터의 빠른 Indexing, Slicing, Sorting 하는 기능
  • 두 데이터 간의 Join(행,열 방향) 기능
  • 데이터의 피봇팅 및 그룹핑
  • 데이터의 통계 및 시각화 기능
  • 외부 데이터를 입력 받아 Pandas 자료구조로 저장 및 출력(CSV, 구분자가 있는 txt, 엑셀데이터, SQL database, XML 등)

3. Pandas 사용하기

Pandas는 파이썬 라이브러리이기 때문에 별도의 설치가 필요한데, Anaconda라는 패키지를 사용하면, Pandas가 기본으로 설치되어 있기 때문에 Anaconda를 이용하는 것을 권장합니다.

Anaconda는 수학, 과학, 데이터 분석 분야에서 사용하는 Python 패키지를 한 번에 설치 할 수 있게 해줍니다. 또한 Jupyter notebook과 같은 IDE 개발 도구도 함께 설치 할 수 있습니다.

Anaconda 공식 홈페이지에서 원클릭으로 쉽게 설치 할 수 있습니다.

4. 포스팅 목자

  1. Pandas의 자료구조-Series
  2. Pandas의 자료구조-DataFrame
  3. 여러 DataFrame 연결하기
  4. Pandas의 파일 입출력
  5. Pandas DataFrame 산술 연산
  6. Pandas DataFrame 통계
  7. Pandas DataFrmae의 sort,rank 함수
  8. Series와 DataFrame에 함수 적용하기
  9. DataFrame의 집계(그룹핑) 함수

다음의 포스팅부터 Jupyter notebook을 사용하여 직접 Pandas를 실습할 예정입니다.
Pandas에 대한 추가적인 정보가 필요할 경우 공식 문서를 참고해주세요.

반응형

+ Recent posts

반응형