내 마음대로 공간

고급연산
In [1]:
#초기화 
import pandas as pd
from pandas import Series, DataFrame
import numpy as np
In [2]:
%matplotlib inline

연산

산술연산

  • 2013~2014년도 nc 선수기록을 DataFrame으로 로딩 한다. 이때 인덱스는 '선수명으로 지정 한다.
  • 2014년도와 2015년도의 홈수 수 합계를 구한다. --> 색인 기반으로 연산 NaN에 대해 처리가 필요.
In [3]:
# 데이터를 읽을 파일 목록 만들기
경로목록 = [    
    'data/NC Dinos 2013.xlsx',
    'data/NC Dinos 2014.xlsx',
    'data/NC Dinos 2015.xlsx'
]
In [4]:
# 지정된 경로로부터 데이터를 읽어서 DataFrame에 넣고 이를 리스트로 만든다. 
# 이때 선수명을 색인으로 사용 한다. 
frame_list = []
for 경로 in 경로목록:
    frame = pd.read_excel(경로)
    frame = frame.set_index('선수명')
    frame_list.append(frame)
In [5]:
# 풀기 - 리스트의 항목을 차례로 각각의 변수에 대입
nc13, nc14, nc15 = frame_list
In [6]:
# DataFrame의 산술연산은 색인을 기반으로 된다. 
# DataFrame의 산술연산이 되려면 모양(타입)이 일치해야 한다. 
# 14년도와 15년도의 홈런 합계 (두 DataFrame은 색인이 일치하지 않기 때문에 NaN 이 발생 한다. )
nc14['홈런'] + nc15['홈런']
Out[6]:
선수명
강구성      NaN
강민국      0.0
권희동      NaN
김성욱      NaN
김종호      NaN
김준완      0.0
김태군      NaN
김태우      NaN
김태진      NaN
나성범     58.0
노진혁      NaN
마낙길      NaN
모창민     22.0
박명환*     NaN
박민우      4.0
박정준      NaN
손시헌     18.0
용덕한      NaN
이종욱     11.0
이창섭      NaN
이호준     47.0
조영훈     14.0
조평호      1.0
지석훈     17.0
최재원      2.0
테임즈     84.0
허준       NaN
Name: 홈런, dtype: float64
In [7]:
# 연산결과가 NaN이 나오는 이유
# +연산시 중간단계의 데이터 모양
#         nc14        nc15
#강구성      0         NaN    --> NAN
#강민국      0          0     -->  0
#권희동     NaN         7     --> NaN
### 권희동은 우리가 원하는 결과가 아니다. 
# 원칙 : 색인끼리 연산, 없는 색인은 자동으로 채워진다.(NaN), NaN과 연산은 무조건 NaN이다. 
In [8]:
# NaN  처리를 위해서 add 함수를 사용 한다. 
# add 함수 사용, 인자 사용 가능 --> + 연산을 수행, 옵션을 수행할수 없기 때문에 add 함수를 사용한다. 
nc14['홈런'].add(nc15['홈런'], fill_value=0)
Out[8]:
선수명
강구성      0.0
강민국      0.0
권희동      7.0
김성욱      1.0
김종호      4.0
김준완      0.0
김태군      6.0
김태우      0.0
김태진      0.0
나성범     58.0
노진혁      1.0
마낙길      0.0
모창민     22.0
박명환*     0.0
박민우      4.0
박정준      0.0
손시헌     18.0
용덕한      0.0
이종욱     11.0
이창섭      0.0
이호준     47.0
조영훈     14.0
조평호      1.0
지석훈     17.0
최재원      2.0
테임즈     84.0
허준       0.0
Name: 홈런, dtype: float64
In [9]:
# add 연산시 중간단계의 데이터 모양
#         nc14        nc15
#강구성      0          0    -->   0
#강민국      0          0     -->  0
#권희동      0          7     -->  7

연습

  • 2013시즌 부터 2015 시즌 까지의 각 선수의 안타, 홈런 합계 산출.
In [10]:
열선택 = ['안타', '홈런']
In [11]:
# 13년도와 14년도와 15년도의 안타와 홈런의 합계를 구한다. 
안타홈런합계 = nc13[열선택].add(nc14[열선택], fill_value=0)
안타홈런합계 = 안타홈런합계[열선택].add(nc15[열선택], fill_value=0)
안타홈런합계
Out[11]:
안타 홈런
선수명
강구성 1.0 0.0
강민국 0.0 0.0
강진성 1.0 0.0
권희동 63.0 7.0
김동건 2.0 1.0
김성욱 5.0 1.0
김종찬 1.0 0.0
김종호 254.0 4.0
김준완 12.0 0.0
김태군 107.0 6.0
김태우 1.0 0.0
김태진 0.0 0.0
나성범 439.0 72.0
노진혁 3.0 1.0
마낙길 9.0 0.0
모창민 281.0 34.0
박명환* 0.0 0.0
박민우 293.0 4.0
박정준 49.0 4.0
손시헌 198.0 18.0
용덕한 12.0 0.0
이상호 31.0 0.0
이승호 0.0 0.0
이종욱 244.0 11.0
이창섭 0.0 0.0
이현곤 38.0 0.0
이호준 370.0 67.0
조영훈 171.0 20.0
조평호 29.0 3.0
지석훈 237.0 20.0
차화준 24.0 1.0
최재원 21.0 2.0
테임즈 332.0 84.0
허준 5.0 0.0

브로드캐스팅을 이용한 연산

In [12]:
# 2차원의 DataFrame과 1차원의 Series의 연산 
# 브로드캐스팅의 개념을 이용해 연산을 한다. 
# frame에서 조정의 값을 이용해 연산.
frame = DataFrame([[10,90], [80,20]])
frame.index = ['가', '나']
frame.columns = list('AB')
frame
Out[12]:
A B
10 90
80 20
In [13]:
# 사전을 이용해 시리즈 생성
조정 = Series({'A':5, 'B':3})
조정
Out[13]:
A    5
B    3
dtype: int64
In [14]:
# A칼럼에서 5를 빼고, B에서 3을 뺀다. (교재 490 12-4 그림과 같이 동작.)
# pandas 기준으로 동작할때는 색인을 붙여 준다. 
# pandas 에서는 직접 해주는 것은 없다. 
frame + 조정
Out[14]:
A B
15 93
85 23
In [15]:
# 브로드캐스팅은 기본적으로 0축(위에서 아래로) 방향으로 일어난다.
# Series는 DataFrame의 열과 색인을 맞춰 연산이 수행된다. 
# --> 시리즈의 데이터는 행으로 배치되고 행 복제가 된다. 
In [16]:
# Series를 색인에 맞추고 열 방향으로 복제가 일어나도록 하기.
조정2 = Series({'가':5, '나':3})
조정2
Out[16]:
가    5
나    3
dtype: int64
In [17]:
frame - 조정2
# 방향이 맞지 않기 때문에 연산이 이상하게 수행 된다. 
#   A  B    -    가   나
#가 NaN NaN   가 NaN NaN 
#나 NaN NaN   나 NaN NaN 
Out[17]:
A B
NaN NaN NaN NaN
NaN NaN NaN NaN
In [18]:
# sub 함수를 이용해 인자를 주고 원하는 방향의 연산이 되도록 한다. 
# axis=0 : Series를 0축으로 데이터를 배치한다. 
# 즉 데이터는 위에서 아래로 배치되고 칼럼 복제가 일어난다. 
# --> 위에서 아래로 배치되고 왼쪽에서 오른쪽으로 데이터 복제한다. 
# frame.sub(시리즈, axis=시리즈를배치할축방향값)
frame.sub(조정2, axis=0)
Out[18]:
A B
5 85
77 17

연습

  1. 2015년도(nc15)의 각 선수들의 안타, 홈런 기록에 대해, 안타와 홈런이 합계에서 차지하는 비율 계산
  2. 예를 들어 안타홈런 합계가 100이고, 안타80, 홈런 20개인 경우 안타 비율은 0.8 홈런 비율은 0.2로 계산되어야 한다.
    • 데이터의 안타는 실제 안타와 홈런의 합계이다.
In [19]:
열선택 = ['안타', '홈런']
nc15[열선택]
Out[19]:
안타 홈런
선수명
테임즈 180 47
나성범 184 28
박민우 158 3
이호준 132 24
김종호 125 4
조영훈 35 8
손시헌 108 13
이종욱 118 5
모창민 62 6
지석훈 111 11
용덕한 12 0
최재원 21 2
박정준 8 0
김태군 107 6
조평호 8 1
이창섭 0 0
김준완 10 0
강구성 1 0
강민국 0 0
김태진 0 0
In [20]:
안타 = nc15["안타"] - nc15["홈런"]
#안타비율 = 안타 / nc15['안타']
#안타비율 = pd.DataFrame(안타비율.fillna(0))
#안타비율.columns = ['안타비율']

#홈런비율 = 1 - 안타비율 
#홈런비율.columns = ["홈런비율"]
#홈런비율
#안타비율
In [21]:
# 실질 안타는 안타-홈런을 해야 한다. 
안타 = nc15["안타"] - nc15["홈런"]
# 안타비율을 구하고 NaN은 0으로 변경
안타비율 = 안타 / nc15['안타']
안타비율 = pd.DataFrame(안타비율.fillna(0))
# 안타비율과 홈런비율 칼럼 추가
안타비율.columns = ["안타비율"]

홈런비율 = nc15["홈런"] / nc15['안타'] 
홈런비율.columns = ["홈런비율"]
#안타비율
#print(안타비율)
실안홈비율 = pd.merge(안타비율.reset_index(), 홈런비율.reset_index())
실안홈비율 = 실안홈비율.set_index(["선수명"])
실안홈비율
Out[21]:
안타비율 0
선수명
테임즈 0.738889 0.261111
나성범 0.847826 0.152174
박민우 0.981013 0.018987
이호준 0.818182 0.181818
김종호 0.968000 0.032000
조영훈 0.771429 0.228571
손시헌 0.879630 0.120370
이종욱 0.957627 0.042373
모창민 0.903226 0.096774
지석훈 0.900901 0.099099
용덕한 1.000000 0.000000
최재원 0.904762 0.095238
박정준 1.000000 0.000000
김태군 0.943925 0.056075
조평호 0.875000 0.125000
이창섭 0.000000 NaN
김준완 1.000000 0.000000
강구성 1.000000 0.000000
강민국 0.000000 NaN
김태진 0.000000 NaN
In [22]:
#안타비율
In [23]:
홈런비율
Out[23]:
선수명
테임즈    0.261111
나성범    0.152174
박민우    0.018987
이호준    0.181818
김종호    0.032000
조영훈    0.228571
손시헌    0.120370
이종욱    0.042373
모창민    0.096774
지석훈    0.099099
용덕한    0.000000
최재원    0.095238
박정준    0.000000
김태군    0.056075
조평호    0.125000
이창섭         NaN
김준완    0.000000
강구성    0.000000
강민국         NaN
김태진         NaN
dtype: float64
In [ ]:
안타.values
In [25]:
# 다른 방식의 풀이: DataFrame에서 제공하는 기술통계 함수사용.

안타홈런 = nc15[열선택]
# 기술통계 계산
## sum()을 사용하면 기본적으로 0축 방향으로 합을 구한다. 
## 행단위로 합계를 구하려면 sum(1)을 사용 한다. 
## cumsum: 누적 합
## sum : 합
## mean : 평균
## idxmin, idxmax: 색인의 최대 최소
## describe 한번에 여러 통계 결과를 만든다. 

# 안타를 함계에 담는다.
합계 = 안타홈런['안타']
합계
Out[25]:
선수명
테임즈    180
나성범    184
박민우    158
이호준    132
김종호    125
조영훈     35
손시헌    108
이종욱    118
모창민     62
지석훈    111
용덕한     12
최재원     21
박정준      8
김태군    107
조평호      8
이창섭      0
김준완     10
강구성      1
강민국      0
김태진      0
Name: 안타, dtype: int64
In [26]:
# 실제 안타를 구한다. : 홈런에서 안타를 뺀 값.
안타 = 안타홈런.loc[:,'안타'].sub(안타홈런.loc[:,'홈런'])
안타
Out[26]:
선수명
테임즈    133
나성범    156
박민우    155
이호준    108
김종호    121
조영훈     27
손시헌     95
이종욱    113
모창민     56
지석훈    100
용덕한     12
최재원     19
박정준      8
김태군    101
조평호      7
이창섭      0
김준완     10
강구성      1
강민국      0
김태진      0
dtype: int64
In [27]:
# 안타홈런 데이터에 업데이트 
안타홈런.loc[:, '안타'] = 안타.values

#합계 = 안타홈런['안타'] + 안타홈런['홈런']
C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\indexing.py:635: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  self.obj[item_labels[indexer[info_axis]]] = value
In [28]:
# 데이터 확인 
안타홈런
Out[28]:
안타 홈런
선수명
테임즈 133 47
나성범 156 28
박민우 155 3
이호준 108 24
김종호 121 4
조영훈 27 8
손시헌 95 13
이종욱 113 5
모창민 56 6
지석훈 100 11
용덕한 12 0
최재원 19 2
박정준 8 0
김태군 101 6
조평호 7 1
이창섭 0 0
김준완 10 0
강구성 1 0
강민국 0 0
김태진 0 0
In [29]:
# 데이터 확인
합계
Out[29]:
선수명
테임즈    133
나성범    156
박민우    155
이호준    108
김종호    121
조영훈     27
손시헌     95
이종욱    113
모창민     56
지석훈    100
용덕한     12
최재원     19
박정준      8
김태군    101
조평호      7
이창섭      0
김준완     10
강구성      1
강민국      0
김태진      0
Name: 안타, dtype: int64
In [30]:
# div 함수를 이용해서 비율 계산하고 NaN 값은 0으로 채운다. 
안타홈런.div(합계, axis=0).fillna(0)
Out[30]:
안타 홈런
선수명
테임즈 1.0 0.353383
나성범 1.0 0.179487
박민우 1.0 0.019355
이호준 1.0 0.222222
김종호 1.0 0.033058
조영훈 1.0 0.296296
손시헌 1.0 0.136842
이종욱 1.0 0.044248
모창민 1.0 0.107143
지석훈 1.0 0.110000
용덕한 1.0 0.000000
최재원 1.0 0.105263
박정준 1.0 0.000000
김태군 1.0 0.059406
조평호 1.0 0.142857
이창섭 0.0 0.000000
김준완 1.0 0.000000
강구성 1.0 0.000000
강민국 0.0 0.000000
김태진 0.0 0.000000

NumPy

  • 행렬 연산을 이용하기 위해 만들어 졌다.
  • NumPy의 자주 사용되는 함수 표...
    • dialg :
    • dot : 행렬 곱셈
    • trace : 형렬 대각선 원소의 합
    • linalg.det : 행렬식 계산
    • linalg.eig :
    • linalg.inv
    • linalg.pinv
    • linalg.qr
    • linalg.svd
    • linalg.solve
    • linalg.lstsq
In [31]:
x = np.array([[1,2,3], [4,5,6]])
x
Out[31]:
array([[1, 2, 3],
       [4, 5, 6]])
In [32]:
k = np.array([2,2,2])
x.dot(k)
#np.ones(3)
Out[32]:
array([12, 30])
In [33]:
y = np.array([[6,23], [-1,7], [8,9]])
y
Out[33]:
array([[ 6, 23],
       [-1,  7],
       [ 8,  9]])
In [34]:
# 각각의 원소(가장 바깥 쪽을 기준으로한 원소)의 곱 구하기 : dot 함수 사용. --> 앞의 행과 뒤의 열을 번갈아 곱한다.
# x 행 * y열 --> x1행*y1열: 6-2+24= 28, x1행*y2열: 23+14+27 = 64, x2행*y1열: 24-5+54=67, x2행*y2열: 92+35+54=181
x.dot(y)
Out[34]:
array([[ 28,  64],
       [ 67, 181]])
In [35]:
## pandas는 자료구조를 제공하고 
## NumPy는 연산의 기능을 제공 한다. 
b = np.array([[1,2], [3,4]])
a = np.array([[1,1], [2,2]])
a.dot(b)
Out[35]:
array([[ 4,  6],
       [ 8, 12]])

개발자 Vs. 데이터과학자

  • 프로그래머 적인 접근 방식을 데이터과학자 방향으로 변환하기

    • 가정 : 1보 전진 또는 후진을 랜덤하게 수행해서 그 결과를 저장 해라.
In [36]:
import random
In [37]:
random.randint(0,1)
Out[37]:
0

개발자적 사고 방식에 의한 계산

In [38]:
# 개발자적 방식의 수행 방식 --> 루프 순환
position = 0
walk = [position]
steps = 1000
for i in range(steps):
    # random.randint(A,B) A~B까지의 정수 랜덤 생성 
    # 0, 1이 랜덤하게 발생: random.randint(0,1)
    step = 1 if random.randint(0,1) else -1
    position += step
    walk.append(position)

## 마지막 10개만 확인
walk[-10:]
Out[38]:
[-21, -22, -23, -24, -23, -22, -21, -20, -21, -20]

데이터 과학자적 사고 방식에 의한 계산

In [39]:
# 데이터 과학자
# ==>  0, 1의 난수 데이터 표를 만든다. 
steps = 1000
draw = np.random.randint(0,2, size=steps)
draw[-10:]
Out[39]:
array([0, 0, 1, 1, 0, 1, 1, 0, 1, 1])
In [40]:
# 표에 따른 스텝 데이터를 만든다. 
# np.where(연산, 참값, 거짓값)
comSteps = np.where(draw > 0, 1, -1)
# 타입 확인
type(comSteps)
Out[40]:
numpy.ndarray
In [41]:
# 걸음수의 누적 합계를 구한다. 
# 누적합계함수 : cumsum
walk = comSteps.cumsum()
In [42]:
walk[-10:]
Out[42]:
array([1, 0, 1, 2, 1, 2, 3, 2, 3, 4], dtype=int32)

5000회 시뮬레이션

  • 위 수행 방식을 5000번 시뮬레이션 하기
In [43]:
timeit?
In [44]:
%%timeit
## 빌트인 매직 커맨드 %%timeit 실행시간을 측정한다. 

# 개발자 방식
for _ in range(5000):
    position = 0
    walk = [position]
    steps = 1000
    for i in range(steps):
        # random.randint(A,B) A~B까지의 정수 랜덤 생성 
        step = 1 if random.randint(0,1) else -1
        position += step
        walk.append(position)
#walk    
9.93 s ± 311 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [45]:
%%timeit
# 데이터과학자 방식
# (5000, 1000)의 난수표 행렬 생성 --> draws
draws = np.random.randint(0,2, size=(5000,1000))
# 0보다크면 1 아니면 -1 값으로 변경.
steps = np.where(draws > 0, 1, -1)

# 행 방향으로 누적 합계를 구하면 된다. --> cumsum(1)
walks = steps.cumsum(1)
# 끝에서 두번째만 확인.
walks[:2]
69.6 ms ± 522 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

Apply 함수와 Map 함수

  • DataFrame의 apply --> "def f(시리즈)" 형식의 함수 사용.
  • Series의 map --> "def f(값)" 형식의 함수 사용
  • DataFrame의 apply 함수를 사용해서 Series의 map과 동일한 결과를 만들 수 있다.
    • 이런 경우 map 사용 권장.
    • 이유 : 동일한 결과를 얻기 위해서 Series를 루프로 순환해야 하기 때문이다.

apply 함수 이해하기

  • DataFrame의 함수
  • apply 함수를 시리즈에 대한 어떤 연산을 수행하는 함수를 인자로 받는다.
  • 따라서 하나의 시리즈로 어떤 작업을 해야 하는 경우 사용 한다.
  • 시리즈는 기본적으로 하나의 열(칼럼)을 사용하지만 axis=1을 사용하면 하나의 행을 사용할 수 있다.
In [142]:
안타홈런열 = ['안타', '홈런']
안타홈런 = nc15[안타홈런열]
실안타 = 안타홈런.loc[:, '안타'] - 안타홈런.loc[:,'홈런']
안타홈런.loc[:,'실안타'] = 실안타 # 안타홈런.loc[:, '안타'] - 안타홈런.loc[:,'홈런']
#안타홈런['안타홈런'] - 안타홈런['홈런']
C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\indexing.py:362: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  self.obj[key] = _infer_fill_value(value)
C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\indexing.py:543: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  self.obj[item] = s
In [47]:
안타홈런
Out[47]:
안타 홈런 실안타
선수명
테임즈 180 47 133
나성범 184 28 156
박민우 158 3 155
이호준 132 24 108
김종호 125 4 121
조영훈 35 8 27
손시헌 108 13 95
이종욱 118 5 113
모창민 62 6 56
지석훈 111 11 100
용덕한 12 0 12
최재원 21 2 19
박정준 8 0 8
김태군 107 6 101
조평호 8 1 7
이창섭 0 0 0
김준완 10 0 10
강구성 1 0 1
강민국 0 0 0
김태진 0 0 0
In [140]:
# 하나의 시리즈에서 최대값과 최소값을 차이를 계산해서 리턴.
def 최대최소차(시리즈):
    return 시리즈.max() - 시리즈.min()
In [141]:
# 열단위로 apply 실행 만일 색인단위로 apply를 하려면 , apply(함수명, axis=1)로 설정한다. 
## 다음은 안타와 홈런, 실안타의 데이터에서 최대값과 최소값의 차이를 보여 준다. 
안타홈런.apply(최대최소차)
Out[141]:
안타    184
홈런     47
dtype: int64
In [50]:
## DataFrame.apply 기능 이해 하기 : for 문을 이용해 apply와 동일한 기능 구현.
## ==> apply는 칼럼을 루프로 순환하거나 행(axis=1)을 루프로 순환 한다. 
결과사전 = {}
for 열제목 in 안타홈런:
     = 안타홈런[열제목]
    결과 = 최대최소차()
    결과사전[열제목] = 결과
Series(결과사전)    
Out[50]:
안타     184
홈런      47
실안타    156
dtype: int64

map 함수 이해하기

  • Series의 함수
  • Value에 대해 필요한 연산을 수행 할 수 있다.

타율을 계산하고 표시 형식 변경해보기

In [51]:
# 데이터 확인 
nc15
Out[51]:
팀명 경기 타석 타수 안타 홈런 득점 타점 볼넷 삼진 도루 BABIP 타율 출루율 장타율 OPS wOBA WAR
선수명
테임즈 NC 142 595 472 180 47 130 140 103 91 40 0.390 0.381 0.497 0.790 1.287 0.520 11.73
나성범 NC 144 622 564 184 28 112 135 33 127 23 0.374 0.326 0.373 0.553 0.926 0.390 4.46
박민우 NC 141 617 520 158 3 111 47 73 108 46 0.373 0.304 0.399 0.404 0.803 0.364 3.52
이호준 NC 131 518 449 132 24 48 110 61 102 0 0.332 0.294 0.381 0.510 0.891 0.381 2.19
김종호 NC 133 486 424 125 4 90 36 44 65 41 0.338 0.295 0.364 0.394 0.758 0.340 1.03
조영훈 NC 103 146 124 35 8 20 35 19 36 3 0.329 0.282 0.372 0.540 0.912 0.389 1.00
손시헌 NC 140 508 440 108 13 56 58 36 66 3 0.260 0.245 0.319 0.398 0.717 0.316 0.85
이종욱 NC 125 504 440 118 5 63 52 54 78 17 0.315 0.268 0.351 0.368 0.719 0.322 0.84
모창민 NC 103 239 214 62 6 23 35 18 52 5 0.352 0.290 0.340 0.439 0.779 0.340 0.76
지석훈 NC 137 466 415 111 11 53 46 23 85 4 0.311 0.267 0.328 0.383 0.711 0.317 0.51
용덕한 NC 50 49 42 12 0 4 5 5 8 2 0.353 0.286 0.375 0.310 0.685 0.326 0.44
최재원 NC 114 102 85 21 2 31 13 10 29 14 0.352 0.247 0.366 0.412 0.778 0.350 0.30
박정준 NC 19 24 21 8 0 2 2 0 5 0 0.500 0.381 0.458 0.476 0.934 0.417 0.25
김태군 NC 144 474 421 107 6 45 52 25 77 1 0.293 0.254 0.307 0.354 0.661 0.294 0.25
조평호 NC 22 22 22 8 1 4 3 0 6 0 0.467 0.364 0.364 0.591 0.955 0.401 0.18
이창섭 NC 15 8 5 0 0 0 0 3 3 0 0.000 0.000 0.375 0.000 0.375 0.286 -0.01
김준완 NC 30 54 44 10 0 12 2 10 10 2 0.294 0.227 0.370 0.227 0.597 0.308 -0.04
강구성 NC 4 5 5 1 0 0 0 0 0 0 0.200 0.200 0.200 0.400 0.600 0.242 -0.04
강민국 NC 1 2 2 0 0 0 0 0 1 0 0.000 0.000 0.000 0.000 0.000 0.000 -0.06
김태진 NC 1 3 3 0 0 0 0 0 0 0 0.000 0.000 0.000 0.000 0.000 0.000 -0.09
In [52]:
# 타율데이터가 있지만 직접 구해본다. 
#안타수 = nc15['안타'] - nc15['홈런'] 
타율 = nc15['안타'] / nc15['타수']
In [53]:
타율
Out[53]:
선수명
테임즈    0.381356
나성범    0.326241
박민우    0.303846
이호준    0.293987
김종호    0.294811
조영훈    0.282258
손시헌    0.245455
이종욱    0.268182
모창민    0.289720
지석훈    0.267470
용덕한    0.285714
최재원    0.247059
박정준    0.380952
김태군    0.254157
조평호    0.363636
이창섭    0.000000
김준완    0.227273
강구성    0.200000
강민국    0.000000
김태진    0.000000
dtype: float64
In [54]:
## 타율의 표시 형식을 변경하려면...(데이터는 변경하지 않는다.)
## 문자열 양식을 활용 한다. 
'{0:%} {0:.1%}'.format(0.3)
Out[54]:
'30.000000% 30.0%'
In [55]:
## 출력형식 변경 함수 만들기 소숫점 둘째 자리까지 표기하고 % 출력.
def 출력형식():
    return "{0:.2%}".format()
In [56]:
## 타율 Series를 루프로 순환하면서 출력.
for  in 타율:
    출력 = 출력형식()
    print(출력)
38.14%
32.62%
30.38%
29.40%
29.48%
28.23%
24.55%
26.82%
28.97%
26.75%
28.57%
24.71%
38.10%
25.42%
36.36%
0.00%
22.73%
20.00%
0.00%
0.00%
In [57]:
# map은 각각의 값들에 매핑되는 것. 
## --> apply를 사용해도 동일 결과가 나오지만 시리즈에서는 map를 사용할 것을 권장.
# 출력형식 함수는 def f(값) 형태로 만들어야 한다. 
# DataFrame의 apply --> def f(시리즈) 형식의 함수 사용.
# Series의 map --> def f(값) 형식의 함수 사용
타율.map(출력형식)
Out[57]:
선수명
테임즈    38.14%
나성범    32.62%
박민우    30.38%
이호준    29.40%
김종호    29.48%
조영훈    28.23%
손시헌    24.55%
이종욱    26.82%
모창민    28.97%
지석훈    26.75%
용덕한    28.57%
최재원    24.71%
박정준    38.10%
김태군    25.42%
조평호    36.36%
이창섭     0.00%
김준완    22.73%
강구성    20.00%
강민국     0.00%
김태진     0.00%
dtype: object
In [58]:
## 원본 데이터를 가지고 해보자.
nc15["타율"].map(출력형식)
Out[58]:
선수명
테임즈    38.10%
나성범    32.60%
박민우    30.40%
이호준    29.40%
김종호    29.50%
조영훈    28.20%
손시헌    24.50%
이종욱    26.80%
모창민    29.00%
지석훈    26.70%
용덕한    28.60%
최재원    24.70%
박정준    38.10%
김태군    25.40%
조평호    36.40%
이창섭     0.00%
김준완    22.70%
강구성    20.00%
강민국     0.00%
김태진     0.00%
Name: 타율, dtype: object

안타와 홈런의 비율 계산

In [59]:
## 안타홈럼비
비율 = 안타홈런.div(안타홈런['안타'], axis=0).fillna(0)
비율[:5]
Out[59]:
안타 홈런 실안타
선수명
테임즈 1.0 0.261111 0.738889
나성범 1.0 0.152174 0.847826
박민우 1.0 0.018987 0.981013
이호준 1.0 0.181818 0.818182
김종호 1.0 0.032000 0.968000
In [60]:
비율.columns = ['비율합','홈런비율', '안타비율']
비율
Out[60]:
비율합 홈런비율 안타비율
선수명
테임즈 1.0 0.261111 0.738889
나성범 1.0 0.152174 0.847826
박민우 1.0 0.018987 0.981013
이호준 1.0 0.181818 0.818182
김종호 1.0 0.032000 0.968000
조영훈 1.0 0.228571 0.771429
손시헌 1.0 0.120370 0.879630
이종욱 1.0 0.042373 0.957627
모창민 1.0 0.096774 0.903226
지석훈 1.0 0.099099 0.900901
용덕한 1.0 0.000000 1.000000
최재원 1.0 0.095238 0.904762
박정준 1.0 0.000000 1.000000
김태군 1.0 0.056075 0.943925
조평호 1.0 0.125000 0.875000
이창섭 0.0 0.000000 0.000000
김준완 1.0 0.000000 1.000000
강구성 1.0 0.000000 1.000000
강민국 0.0 0.000000 0.000000
김태진 0.0 0.000000 0.000000
In [61]:
# 비율합 칼럼 제거
비율 = 비율.drop('비율합', axis=1)
비율
Out[61]:
홈런비율 안타비율
선수명
테임즈 0.261111 0.738889
나성범 0.152174 0.847826
박민우 0.018987 0.981013
이호준 0.181818 0.818182
김종호 0.032000 0.968000
조영훈 0.228571 0.771429
손시헌 0.120370 0.879630
이종욱 0.042373 0.957627
모창민 0.096774 0.903226
지석훈 0.099099 0.900901
용덕한 0.000000 1.000000
최재원 0.095238 0.904762
박정준 0.000000 1.000000
김태군 0.056075 0.943925
조평호 0.125000 0.875000
이창섭 0.000000 0.000000
김준완 0.000000 1.000000
강구성 0.000000 1.000000
강민국 0.000000 0.000000
김태진 0.000000 0.000000
In [62]:
# index 리셋
비율.reset_index()
Out[62]:
선수명 홈런비율 안타비율
0 테임즈 0.261111 0.738889
1 나성범 0.152174 0.847826
2 박민우 0.018987 0.981013
3 이호준 0.181818 0.818182
4 김종호 0.032000 0.968000
5 조영훈 0.228571 0.771429
6 손시헌 0.120370 0.879630
7 이종욱 0.042373 0.957627
8 모창민 0.096774 0.903226
9 지석훈 0.099099 0.900901
10 용덕한 0.000000 1.000000
11 최재원 0.095238 0.904762
12 박정준 0.000000 1.000000
13 김태군 0.056075 0.943925
14 조평호 0.125000 0.875000
15 이창섭 0.000000 0.000000
16 김준완 0.000000 1.000000
17 강구성 0.000000 1.000000
18 강민국 0.000000 0.000000
19 김태진 0.000000 0.000000
In [63]:
#안타홈런.reset_index()
## 안타홈런과 비율을 병합.
안타홈런비 = pd.merge(안타홈런.reset_index(), 비율.reset_index())
# 인덱스 선수명으로 지정
안타홈런비 = 안타홈런비.set_index('선수명')
안타홈런비
Out[63]:
안타 홈런 실안타 홈런비율 안타비율
선수명
테임즈 180 47 133 0.261111 0.738889
나성범 184 28 156 0.152174 0.847826
박민우 158 3 155 0.018987 0.981013
이호준 132 24 108 0.181818 0.818182
김종호 125 4 121 0.032000 0.968000
조영훈 35 8 27 0.228571 0.771429
손시헌 108 13 95 0.120370 0.879630
이종욱 118 5 113 0.042373 0.957627
모창민 62 6 56 0.096774 0.903226
지석훈 111 11 100 0.099099 0.900901
용덕한 12 0 12 0.000000 1.000000
최재원 21 2 19 0.095238 0.904762
박정준 8 0 8 0.000000 1.000000
김태군 107 6 101 0.056075 0.943925
조평호 8 1 7 0.125000 0.875000
이창섭 0 0 0 0.000000 0.000000
김준완 10 0 10 0.000000 1.000000
강구성 1 0 1 0.000000 1.000000
강민국 0 0 0 0.000000 0.000000
김태진 0 0 0 0.000000 0.000000

applymap 함수를 사용해 전체 과정을 한줄로 실행

  • applymap 함수 : DataFrame의 함수
  • Series에 대해서 apply 후 그 시리즈의 값에 대해서 map을 하는 함수. apply -> map(f)
In [144]:
# DataFrame.applymap 함수 : Series에 대해서 apply 후 그 시리즈의 값에 대해서 map을 하는 함수. apply -> map(f) 
비율.applymap(출력형식)
Out[144]:
홈런비율 안타비율
선수명
테임즈 26.11% 73.89%
나성범 15.22% 84.78%
박민우 1.90% 98.10%
이호준 18.18% 81.82%
김종호 3.20% 96.80%
조영훈 22.86% 77.14%
손시헌 12.04% 87.96%
이종욱 4.24% 95.76%
모창민 9.68% 90.32%
지석훈 9.91% 90.09%
용덕한 0.00% 100.00%
최재원 9.52% 90.48%
박정준 0.00% 100.00%
김태군 5.61% 94.39%
조평호 12.50% 87.50%
이창섭 0.00% 0.00%
김준완 0.00% 100.00%
강구성 0.00% 100.00%
강민국 0.00% 0.00%
김태진 0.00% 0.00%
In [65]:
#pd.merge(안타홈런비.reset_index(), 안타홈런비[["안타비율", '홈런비율']].applymap(출력형식).reset_index())
#안타홈런비[["안타비율", '홈런비율']].applymap(출력형식).reset_index()
#안타홈런비.reset_index()
안타홈런비[["안타비율", '홈런비율']].applymap(출력형식)
Out[65]:
안타비율 홈런비율
선수명
테임즈 73.89% 26.11%
나성범 84.78% 15.22%
박민우 98.10% 1.90%
이호준 81.82% 18.18%
김종호 96.80% 3.20%
조영훈 77.14% 22.86%
손시헌 87.96% 12.04%
이종욱 95.76% 4.24%
모창민 90.32% 9.68%
지석훈 90.09% 9.91%
용덕한 100.00% 0.00%
최재원 90.48% 9.52%
박정준 100.00% 0.00%
김태군 94.39% 5.61%
조평호 87.50% 12.50%
이창섭 0.00% 0.00%
김준완 100.00% 0.00%
강구성 100.00% 0.00%
강민국 0.00% 0.00%
김태진 0.00% 0.00%
In [145]:
## applymap 함수를 구현하면 다음과 같이 만들 수 있다. 
# 각 열별로 (apply)
for 열제목 in 비율:
    print('===========' + 열제목 + '==============')
     = 비율[열제목]
    # 개별 값 별로 반복 (map)
    for  in :
        출력 = 출력형식()
        print(출력)
===========홈런비율==============
26.11%
15.22%
1.90%
18.18%
3.20%
22.86%
12.04%
4.24%
9.68%
9.91%
0.00%
9.52%
0.00%
5.61%
12.50%
0.00%
0.00%
0.00%
0.00%
0.00%
===========안타비율==============
73.89%
84.78%
98.10%
81.82%
96.80%
77.14%
87.96%
95.76%
90.32%
90.09%
100.00%
90.48%
100.00%
94.39%
87.50%
0.00%
100.00%
100.00%
0.00%
0.00%

정렬

  • sort_values() 함수 사용하기

sort_values() 함수

In [67]:
# 홈런 많은 기준으로 정렬
안타홈런비.sort_values(by='홈런', ascending=False)
Out[67]:
안타 홈런 실안타 홈런비율 안타비율
선수명
테임즈 180 47 133 0.261111 0.738889
나성범 184 28 156 0.152174 0.847826
이호준 132 24 108 0.181818 0.818182
손시헌 108 13 95 0.120370 0.879630
지석훈 111 11 100 0.099099 0.900901
조영훈 35 8 27 0.228571 0.771429
모창민 62 6 56 0.096774 0.903226
김태군 107 6 101 0.056075 0.943925
이종욱 118 5 113 0.042373 0.957627
김종호 125 4 121 0.032000 0.968000
박민우 158 3 155 0.018987 0.981013
최재원 21 2 19 0.095238 0.904762
조평호 8 1 7 0.125000 0.875000
김준완 10 0 10 0.000000 1.000000
강민국 0 0 0 0.000000 0.000000
강구성 1 0 1 0.000000 1.000000
용덕한 12 0 12 0.000000 1.000000
이창섭 0 0 0 0.000000 0.000000
박정준 8 0 8 0.000000 1.000000
김태진 0 0 0 0.000000 0.000000
In [68]:
# 기준을 두개 이상 설정
안타홈런비.sort_values(by=['홈런', '안타'], ascending=False)
Out[68]:
안타 홈런 실안타 홈런비율 안타비율
선수명
테임즈 180 47 133 0.261111 0.738889
나성범 184 28 156 0.152174 0.847826
이호준 132 24 108 0.181818 0.818182
손시헌 108 13 95 0.120370 0.879630
지석훈 111 11 100 0.099099 0.900901
조영훈 35 8 27 0.228571 0.771429
김태군 107 6 101 0.056075 0.943925
모창민 62 6 56 0.096774 0.903226
이종욱 118 5 113 0.042373 0.957627
김종호 125 4 121 0.032000 0.968000
박민우 158 3 155 0.018987 0.981013
최재원 21 2 19 0.095238 0.904762
조평호 8 1 7 0.125000 0.875000
용덕한 12 0 12 0.000000 1.000000
김준완 10 0 10 0.000000 1.000000
박정준 8 0 8 0.000000 1.000000
강구성 1 0 1 0.000000 1.000000
이창섭 0 0 0 0.000000 0.000000
강민국 0 0 0 0.000000 0.000000
김태진 0 0 0 0.000000 0.000000

index 정렬 : sort_index() 함수

In [69]:
안타홈런비.index
Out[69]:
Index(['테임즈', '나성범', '박민우', '이호준', '김종호', '조영훈', '손시헌', '이종욱', '모창민', '지석훈',
       '용덕한', '최재원', '박정준', '김태군', '조평호', '이창섭', '김준완', '강구성', '강민국', '김태진'],
      dtype='object', name='선수명')
In [70]:
# 색인의 값을 가지고 정렬
안타홈런비.sort_index()
Out[70]:
안타 홈런 실안타 홈런비율 안타비율
선수명
강구성 1 0 1 0.000000 1.000000
강민국 0 0 0 0.000000 0.000000
김종호 125 4 121 0.032000 0.968000
김준완 10 0 10 0.000000 1.000000
김태군 107 6 101 0.056075 0.943925
김태진 0 0 0 0.000000 0.000000
나성범 184 28 156 0.152174 0.847826
모창민 62 6 56 0.096774 0.903226
박민우 158 3 155 0.018987 0.981013
박정준 8 0 8 0.000000 1.000000
손시헌 108 13 95 0.120370 0.879630
용덕한 12 0 12 0.000000 1.000000
이종욱 118 5 113 0.042373 0.957627
이창섭 0 0 0 0.000000 0.000000
이호준 132 24 108 0.181818 0.818182
조영훈 35 8 27 0.228571 0.771429
조평호 8 1 7 0.125000 0.875000
지석훈 111 11 100 0.099099 0.900901
최재원 21 2 19 0.095238 0.904762
테임즈 180 47 133 0.261111 0.738889
In [71]:
# 색인을 역순으로 조회
안타홈런비.sort_index(ascending=False)
Out[71]:
안타 홈런 실안타 홈런비율 안타비율
선수명
테임즈 180 47 133 0.261111 0.738889
최재원 21 2 19 0.095238 0.904762
지석훈 111 11 100 0.099099 0.900901
조평호 8 1 7 0.125000 0.875000
조영훈 35 8 27 0.228571 0.771429
이호준 132 24 108 0.181818 0.818182
이창섭 0 0 0 0.000000 0.000000
이종욱 118 5 113 0.042373 0.957627
용덕한 12 0 12 0.000000 1.000000
손시헌 108 13 95 0.120370 0.879630
박정준 8 0 8 0.000000 1.000000
박민우 158 3 155 0.018987 0.981013
모창민 62 6 56 0.096774 0.903226
나성범 184 28 156 0.152174 0.847826
김태진 0 0 0 0.000000 0.000000
김태군 107 6 101 0.056075 0.943925
김준완 10 0 10 0.000000 1.000000
김종호 125 4 121 0.032000 0.968000
강민국 0 0 0 0.000000 0.000000
강구성 1 0 1 0.000000 1.000000
In [72]:
홈런 = 안타홈런비['홈런']
In [73]:
# 정렬은되나 등수를 확인할 수 없다. 
홈런.sort_values(ascending=False)
Out[73]:
선수명
테임즈    47
나성범    28
이호준    24
손시헌    13
지석훈    11
조영훈     8
김태군     6
모창민     6
이종욱     5
김종호     4
박민우     3
최재원     2
조평호     1
박정준     0
용덕한     0
강민국     0
이창섭     0
김준완     0
강구성     0
김태진     0
Name: 홈런, dtype: int64

등수 확인 하기

  • rank() 함수 사용
In [74]:
# 순위 매기기 --> 낮은 값이 더 높은 순위로 표기
홈런.rank()
Out[74]:
선수명
테임즈    20.0
나성범    19.0
박민우    10.0
이호준    18.0
김종호    11.0
조영훈    15.0
손시헌    17.0
이종욱    12.0
모창민    13.5
지석훈    16.0
용덕한     4.0
최재원     9.0
박정준     4.0
김태군    13.5
조평호     8.0
이창섭     4.0
김준완     4.0
강구성     4.0
강민국     4.0
김태진     4.0
Name: 홈런, dtype: float64
In [75]:
# 순위 매기기 (정렬이 안된다. ...)
홈런.rank(ascending=False)
Out[75]:
선수명
테임즈     1.0
나성범     2.0
박민우    11.0
이호준     3.0
김종호    10.0
조영훈     6.0
손시헌     4.0
이종욱     9.0
모창민     7.5
지석훈     5.0
용덕한    17.0
최재원    12.0
박정준    17.0
김태군     7.5
조평호    13.0
이창섭    17.0
김준완    17.0
강구성    17.0
강민국    17.0
김태진    17.0
Name: 홈런, dtype: float64
In [76]:
#순위 매기고 다시 소팅
## --> 7.5라는 등수가 나타남. 
### ==> 7등이 2명이 나와서 이런 현상이 발생.
홈런.rank(ascending=False).sort_values()
Out[76]:
선수명
테임즈     1.0
나성범     2.0
이호준     3.0
손시헌     4.0
지석훈     5.0
조영훈     6.0
모창민     7.5
김태군     7.5
이종욱     9.0
김종호    10.0
박민우    11.0
최재원    12.0
조평호    13.0
강민국    17.0
용덕한    17.0
박정준    17.0
이창섭    17.0
김준완    17.0
강구성    17.0
김태진    17.0
Name: 홈런, dtype: float64
In [77]:
# 순위 매기기 동점의 등수를 순위를 매기는 방식
# 동점 처리 방식 : method='max' , 'min', 'first', 'average'(디폴트 방식) 
홈런.rank(ascending=False, method='min').sort_values()
Out[77]:
선수명
테임즈     1.0
나성범     2.0
이호준     3.0
손시헌     4.0
지석훈     5.0
조영훈     6.0
모창민     7.0
김태군     7.0
이종욱     9.0
김종호    10.0
박민우    11.0
최재원    12.0
조평호    13.0
강민국    14.0
용덕한    14.0
박정준    14.0
이창섭    14.0
김준완    14.0
강구성    14.0
김태진    14.0
Name: 홈런, dtype: float64

Math 사용

In [147]:
# 함수를 사용하기 위한 모듈 가져오기
import math
In [79]:
## 함수에 대한 도움말 보기
math.ceil?
In [80]:
np.ceil?
In [81]:
np.ceil([1.5, 2.5, 3.5, 4.4, 4.5, -1.5])
Out[81]:
array([ 2.,  3.,  4.,  5.,  5., -1.])

통계 분석 함수

In [82]:
주식=pd.read_csv('data/stock_px.csv', index_col=0)
In [83]:
주식[:5]
Out[83]:
AAPL MSFT XOM SPX
2003-01-02 00:00:00 7.40 21.11 29.22 909.03
2003-01-03 00:00:00 7.45 21.14 29.24 908.59
2003-01-06 00:00:00 7.45 21.52 29.96 929.01
2003-01-07 00:00:00 7.43 21.93 28.95 922.93
2003-01-08 00:00:00 7.28 21.31 28.83 909.93
In [84]:
# pct_change() : 윗값과 아랫값과의 변화량
수익률 = 주식.pct_change()
In [85]:
수익률[:10]
## 첫번째 줄에 변화량을 없기 때문에 NaN 표기
Out[85]:
AAPL MSFT XOM SPX
2003-01-02 00:00:00 NaN NaN NaN NaN
2003-01-03 00:00:00 0.006757 0.001421 0.000684 -0.000484
2003-01-06 00:00:00 0.000000 0.017975 0.024624 0.022474
2003-01-07 00:00:00 -0.002685 0.019052 -0.033712 -0.006545
2003-01-08 00:00:00 -0.020188 -0.028272 -0.004145 -0.014086
2003-01-09 00:00:00 0.008242 0.029094 0.021159 0.019386
2003-01-10 00:00:00 0.002725 0.001824 -0.013927 0.000000
2003-01-13 00:00:00 -0.005435 0.008648 -0.004134 -0.001412
2003-01-14 00:00:00 -0.002732 0.010379 0.008993 0.005830
2003-01-15 00:00:00 -0.010959 -0.012506 -0.013713 -0.014426
In [86]:
# 필요없는 nan 데이터를 drop 시킨다. 
수익률.dropna()[:10]
Out[86]:
AAPL MSFT XOM SPX
2003-01-03 00:00:00 0.006757 0.001421 0.000684 -0.000484
2003-01-06 00:00:00 0.000000 0.017975 0.024624 0.022474
2003-01-07 00:00:00 -0.002685 0.019052 -0.033712 -0.006545
2003-01-08 00:00:00 -0.020188 -0.028272 -0.004145 -0.014086
2003-01-09 00:00:00 0.008242 0.029094 0.021159 0.019386
2003-01-10 00:00:00 0.002725 0.001824 -0.013927 0.000000
2003-01-13 00:00:00 -0.005435 0.008648 -0.004134 -0.001412
2003-01-14 00:00:00 -0.002732 0.010379 0.008993 0.005830
2003-01-15 00:00:00 -0.010959 -0.012506 -0.013713 -0.014426
2003-01-16 00:00:00 0.012465 -0.016282 0.004519 -0.003942
In [87]:
# 확률통계의 correlation - 상관관계 --> 상관관계가 높을 수록 1에 접근한다. 0.5가 넘으면 상관관계가 높은걸로 볼 수 있다. 
# XOM - SPX 간의 상관 관계가 가장 높게 나온다. 
수익률.corr() 
Out[87]:
AAPL MSFT XOM SPX
AAPL 1.000000 0.444697 0.385927 0.564474
MSFT 0.444697 1.000000 0.534691 0.714763
XOM 0.385927 0.534691 1.000000 0.764643
SPX 0.564474 0.714763 0.764643 1.000000
In [88]:
# 공분산
수익률.cov()
Out[88]:
AAPL MSFT XOM SPX
AAPL 0.000600 0.000193 0.000158 0.000186
MSFT 0.000193 0.000314 0.000158 0.000171
XOM 0.000158 0.000158 0.000279 0.000172
SPX 0.000186 0.000171 0.000172 0.000181

NaN 데이터 처리 (누락된 데이터 처리)

2013~2015 시즌 데이터를 읽어서 "시즌" 열을 추가하고 다시 저장

  • 각 데이터를 읽어서 시즌 열 추가
  • index를 스즌, 선수명으로 변경
  • 이를 다시 엑셀에 저장
  • 저장된 엑셀을 다시 로드 --> 시즌에 NaN 값으로 로딩.

단순한 NaN 처리 : fillna() 함수

In [89]:
#nc 데이터 다시 로딩. 
경로목록 = [    
    'data/NC Dinos 2013.xlsx',
    'data/NC Dinos 2014.xlsx',
    'data/NC Dinos 2015.xlsx'
]
인덱스열 = ['시즌', '선수명']

frame_list = []
for 시즌 in range(2013, 2016):
    경로 = 'data/NC Dinos {}.xlsx'.format(시즌)
    frame = pd.read_excel(경로)
    frame['시즌'] = 시즌
    #frame = frame.set_index(인덱스열)
    frame_list.append(frame)

# 풀기 - 리스트의 항목을 차례로 각각의 변수에 대입
nc13, nc14, nc15 = frame_list
In [90]:
# nc15['시즌'] = 2015
nc15
Out[90]:
선수명 팀명 경기 타석 타수 안타 홈런 득점 타점 볼넷 삼진 도루 BABIP 타율 출루율 장타율 OPS wOBA WAR 시즌
0 테임즈 NC 142 595 472 180 47 130 140 103 91 40 0.390 0.381 0.497 0.790 1.287 0.520 11.73 2015
1 나성범 NC 144 622 564 184 28 112 135 33 127 23 0.374 0.326 0.373 0.553 0.926 0.390 4.46 2015
2 박민우 NC 141 617 520 158 3 111 47 73 108 46 0.373 0.304 0.399 0.404 0.803 0.364 3.52 2015
3 이호준 NC 131 518 449 132 24 48 110 61 102 0 0.332 0.294 0.381 0.510 0.891 0.381 2.19 2015
4 김종호 NC 133 486 424 125 4 90 36 44 65 41 0.338 0.295 0.364 0.394 0.758 0.340 1.03 2015
5 조영훈 NC 103 146 124 35 8 20 35 19 36 3 0.329 0.282 0.372 0.540 0.912 0.389 1.00 2015
6 손시헌 NC 140 508 440 108 13 56 58 36 66 3 0.260 0.245 0.319 0.398 0.717 0.316 0.85 2015
7 이종욱 NC 125 504 440 118 5 63 52 54 78 17 0.315 0.268 0.351 0.368 0.719 0.322 0.84 2015
8 모창민 NC 103 239 214 62 6 23 35 18 52 5 0.352 0.290 0.340 0.439 0.779 0.340 0.76 2015
9 지석훈 NC 137 466 415 111 11 53 46 23 85 4 0.311 0.267 0.328 0.383 0.711 0.317 0.51 2015
10 용덕한 NC 50 49 42 12 0 4 5 5 8 2 0.353 0.286 0.375 0.310 0.685 0.326 0.44 2015
11 최재원 NC 114 102 85 21 2 31 13 10 29 14 0.352 0.247 0.366 0.412 0.778 0.350 0.30 2015
12 박정준 NC 19 24 21 8 0 2 2 0 5 0 0.500 0.381 0.458 0.476 0.934 0.417 0.25 2015
13 김태군 NC 144 474 421 107 6 45 52 25 77 1 0.293 0.254 0.307 0.354 0.661 0.294 0.25 2015
14 조평호 NC 22 22 22 8 1 4 3 0 6 0 0.467 0.364 0.364 0.591 0.955 0.401 0.18 2015
15 이창섭 NC 15 8 5 0 0 0 0 3 3 0 0.000 0.000 0.375 0.000 0.375 0.286 -0.01 2015
16 김준완 NC 30 54 44 10 0 12 2 10 10 2 0.294 0.227 0.370 0.227 0.597 0.308 -0.04 2015
17 강구성 NC 4 5 5 1 0 0 0 0 0 0 0.200 0.200 0.200 0.400 0.600 0.242 -0.04 2015
18 강민국 NC 1 2 2 0 0 0 0 0 1 0 0.000 0.000 0.000 0.000 0.000 0.000 -0.06 2015
19 김태진 NC 1 3 3 0 0 0 0 0 0 0 0.000 0.000 0.000 0.000 0.000 0.000 -0.09 2015
In [91]:
## 인덱스 리셋 -- 시즌, 선수명으로 인덱스 다시 셋팅
## reset_index()를 하지 않으면 인덱스 셋팅되지 않는다. 
nc15.reset_index().set_index(['시즌', '선수명'])
Out[91]:
index 팀명 경기 타석 타수 안타 홈런 득점 타점 볼넷 삼진 도루 BABIP 타율 출루율 장타율 OPS wOBA WAR
시즌 선수명
2015 테임즈 0 NC 142 595 472 180 47 130 140 103 91 40 0.390 0.381 0.497 0.790 1.287 0.520 11.73
나성범 1 NC 144 622 564 184 28 112 135 33 127 23 0.374 0.326 0.373 0.553 0.926 0.390 4.46
박민우 2 NC 141 617 520 158 3 111 47 73 108 46 0.373 0.304 0.399 0.404 0.803 0.364 3.52
이호준 3 NC 131 518 449 132 24 48 110 61 102 0 0.332 0.294 0.381 0.510 0.891 0.381 2.19
김종호 4 NC 133 486 424 125 4 90 36 44 65 41 0.338 0.295 0.364 0.394 0.758 0.340 1.03
조영훈 5 NC 103 146 124 35 8 20 35 19 36 3 0.329 0.282 0.372 0.540 0.912 0.389 1.00
손시헌 6 NC 140 508 440 108 13 56 58 36 66 3 0.260 0.245 0.319 0.398 0.717 0.316 0.85
이종욱 7 NC 125 504 440 118 5 63 52 54 78 17 0.315 0.268 0.351 0.368 0.719 0.322 0.84
모창민 8 NC 103 239 214 62 6 23 35 18 52 5 0.352 0.290 0.340 0.439 0.779 0.340 0.76
지석훈 9 NC 137 466 415 111 11 53 46 23 85 4 0.311 0.267 0.328 0.383 0.711 0.317 0.51
용덕한 10 NC 50 49 42 12 0 4 5 5 8 2 0.353 0.286 0.375 0.310 0.685 0.326 0.44
최재원 11 NC 114 102 85 21 2 31 13 10 29 14 0.352 0.247 0.366 0.412 0.778 0.350 0.30
박정준 12 NC 19 24 21 8 0 2 2 0 5 0 0.500 0.381 0.458 0.476 0.934 0.417 0.25
김태군 13 NC 144 474 421 107 6 45 52 25 77 1 0.293 0.254 0.307 0.354 0.661 0.294 0.25
조평호 14 NC 22 22 22 8 1 4 3 0 6 0 0.467 0.364 0.364 0.591 0.955 0.401 0.18
이창섭 15 NC 15 8 5 0 0 0 0 3 3 0 0.000 0.000 0.375 0.000 0.375 0.286 -0.01
김준완 16 NC 30 54 44 10 0 12 2 10 10 2 0.294 0.227 0.370 0.227 0.597 0.308 -0.04
강구성 17 NC 4 5 5 1 0 0 0 0 0 0 0.200 0.200 0.200 0.400 0.600 0.242 -0.04
강민국 18 NC 1 2 2 0 0 0 0 0 1 0 0.000 0.000 0.000 0.000 0.000 0.000 -0.06
김태진 19 NC 1 3 3 0 0 0 0 0 0 0 0.000 0.000 0.000 0.000 0.000 0.000 -0.09
In [92]:
# nc15에 갱신
nc15 = nc15.reset_index().set_index(['시즌', '선수명'])
In [93]:
# excel 파일에 저장
nc15.to_excel('nc15.xlsx')
In [94]:
# excel 파일에서 다시 읽어오기 
nc15 = pd.read_excel('nc15.xlsx')
In [95]:
nc15
# 시즌 열이 유실되어 있는 모양을 확인할 수 있다. 중첩인덱스 설정된 상태에서 저장된 경우 상위 인덱스의 값은 생략되어 저장된다. 
Out[95]:
시즌 선수명 index 팀명 경기 타석 타수 안타 홈런 득점 ... 볼넷 삼진 도루 BABIP 타율 출루율 장타율 OPS wOBA WAR
0 2015.0 테임즈 0 NC 142 595 472 180 47 130 ... 103 91 40 0.390 0.381 0.497 0.790 1.287 0.520 11.73
1 NaN 나성범 1 NC 144 622 564 184 28 112 ... 33 127 23 0.374 0.326 0.373 0.553 0.926 0.390 4.46
2 NaN 박민우 2 NC 141 617 520 158 3 111 ... 73 108 46 0.373 0.304 0.399 0.404 0.803 0.364 3.52
3 NaN 이호준 3 NC 131 518 449 132 24 48 ... 61 102 0 0.332 0.294 0.381 0.510 0.891 0.381 2.19
4 NaN 김종호 4 NC 133 486 424 125 4 90 ... 44 65 41 0.338 0.295 0.364 0.394 0.758 0.340 1.03
5 NaN 조영훈 5 NC 103 146 124 35 8 20 ... 19 36 3 0.329 0.282 0.372 0.540 0.912 0.389 1.00
6 NaN 손시헌 6 NC 140 508 440 108 13 56 ... 36 66 3 0.260 0.245 0.319 0.398 0.717 0.316 0.85
7 NaN 이종욱 7 NC 125 504 440 118 5 63 ... 54 78 17 0.315 0.268 0.351 0.368 0.719 0.322 0.84
8 NaN 모창민 8 NC 103 239 214 62 6 23 ... 18 52 5 0.352 0.290 0.340 0.439 0.779 0.340 0.76
9 NaN 지석훈 9 NC 137 466 415 111 11 53 ... 23 85 4 0.311 0.267 0.328 0.383 0.711 0.317 0.51
10 NaN 용덕한 10 NC 50 49 42 12 0 4 ... 5 8 2 0.353 0.286 0.375 0.310 0.685 0.326 0.44
11 NaN 최재원 11 NC 114 102 85 21 2 31 ... 10 29 14 0.352 0.247 0.366 0.412 0.778 0.350 0.30
12 NaN 박정준 12 NC 19 24 21 8 0 2 ... 0 5 0 0.500 0.381 0.458 0.476 0.934 0.417 0.25
13 NaN 김태군 13 NC 144 474 421 107 6 45 ... 25 77 1 0.293 0.254 0.307 0.354 0.661 0.294 0.25
14 NaN 조평호 14 NC 22 22 22 8 1 4 ... 0 6 0 0.467 0.364 0.364 0.591 0.955 0.401 0.18
15 NaN 이창섭 15 NC 15 8 5 0 0 0 ... 3 3 0 0.000 0.000 0.375 0.000 0.375 0.286 -0.01
16 NaN 김준완 16 NC 30 54 44 10 0 12 ... 10 10 2 0.294 0.227 0.370 0.227 0.597 0.308 -0.04
17 NaN 강구성 17 NC 4 5 5 1 0 0 ... 0 0 0 0.200 0.200 0.200 0.400 0.600 0.242 -0.04
18 NaN 강민국 18 NC 1 2 2 0 0 0 ... 0 1 0 0.000 0.000 0.000 0.000 0.000 0.000 -0.06
19 NaN 김태진 19 NC 1 3 3 0 0 0 ... 0 0 0 0.000 0.000 0.000 0.000 0.000 0.000 -0.09

20 rows × 21 columns

In [96]:
# NaN을 2015로 채운다. 
nc15 = nc15.fillna(2015)
In [97]:
#  인덱스 다시 설정.
nc15.reset_index()
nc15 = nc15.set_index(['시즌', '선수명'])
In [98]:
# 다시 복구 완료.
nc15
Out[98]:
index 팀명 경기 타석 타수 안타 홈런 득점 타점 볼넷 삼진 도루 BABIP 타율 출루율 장타율 OPS wOBA WAR
시즌 선수명
2015.0 테임즈 0 NC 142 595 472 180 47 130 140 103 91 40 0.390 0.381 0.497 0.790 1.287 0.520 11.73
나성범 1 NC 144 622 564 184 28 112 135 33 127 23 0.374 0.326 0.373 0.553 0.926 0.390 4.46
박민우 2 NC 141 617 520 158 3 111 47 73 108 46 0.373 0.304 0.399 0.404 0.803 0.364 3.52
이호준 3 NC 131 518 449 132 24 48 110 61 102 0 0.332 0.294 0.381 0.510 0.891 0.381 2.19
김종호 4 NC 133 486 424 125 4 90 36 44 65 41 0.338 0.295 0.364 0.394 0.758 0.340 1.03
조영훈 5 NC 103 146 124 35 8 20 35 19 36 3 0.329 0.282 0.372 0.540 0.912 0.389 1.00
손시헌 6 NC 140 508 440 108 13 56 58 36 66 3 0.260 0.245 0.319 0.398 0.717 0.316 0.85
이종욱 7 NC 125 504 440 118 5 63 52 54 78 17 0.315 0.268 0.351 0.368 0.719 0.322 0.84
모창민 8 NC 103 239 214 62 6 23 35 18 52 5 0.352 0.290 0.340 0.439 0.779 0.340 0.76
지석훈 9 NC 137 466 415 111 11 53 46 23 85 4 0.311 0.267 0.328 0.383 0.711 0.317 0.51
용덕한 10 NC 50 49 42 12 0 4 5 5 8 2 0.353 0.286 0.375 0.310 0.685 0.326 0.44
최재원 11 NC 114 102 85 21 2 31 13 10 29 14 0.352 0.247 0.366 0.412 0.778 0.350 0.30
박정준 12 NC 19 24 21 8 0 2 2 0 5 0 0.500 0.381 0.458 0.476 0.934 0.417 0.25
김태군 13 NC 144 474 421 107 6 45 52 25 77 1 0.293 0.254 0.307 0.354 0.661 0.294 0.25
조평호 14 NC 22 22 22 8 1 4 3 0 6 0 0.467 0.364 0.364 0.591 0.955 0.401 0.18
이창섭 15 NC 15 8 5 0 0 0 0 3 3 0 0.000 0.000 0.375 0.000 0.375 0.286 -0.01
김준완 16 NC 30 54 44 10 0 12 2 10 10 2 0.294 0.227 0.370 0.227 0.597 0.308 -0.04
강구성 17 NC 4 5 5 1 0 0 0 0 0 0 0.200 0.200 0.200 0.400 0.600 0.242 -0.04
강민국 18 NC 1 2 2 0 0 0 0 0 1 0 0.000 0.000 0.000 0.000 0.000 0.000 -0.06
김태진 19 NC 1 3 3 0 0 0 0 0 0 0 0.000 0.000 0.000 0.000 0.000 0.000 -0.09

복잡한 형태의 NaN 값 채우기

In [99]:
#nc13['시즌'] = 2013
인덱스열 = ['시즌', '선수명']
nc13 = nc13.reset_index().set_index(인덱스열)
#nc14['시즌'] = 2014
nc14 = nc14.reset_index().set_index(인덱스열)
In [100]:
## 세 시슨 데이터 합치기 
nc = pd.concat([nc13, nc14, nc15])
In [101]:
# excel 내보내기
nc.to_excel('nc_all.xlsx')
In [102]:
# excel 다시 읽어오기 
nc = pd.read_excel('nc_all.xlsx')
In [103]:
nc
# 시즌 데이터가.... 2013..NaN...2014..NaN...2015... --> NaN데이터를 동일한 값으로 채울수 없다. 
# 전향보간 방식을 사용해서 채운다. 앞의 값으로 뒤의 값을 채운다. 
Out[103]:
시즌 선수명 index 팀명 경기 타석 타수 안타 홈런 득점 ... 볼넷 삼진 도루 BABIP 타율 출루율 장타율 OPS wOBA WAR
0 2013.0 모창민 0 NC 108 436 395 109 12 57 ... 37 68 16 0.307 0.276 0.339 0.443 0.782 0.353 2.31
1 NaN 이호준 1 NC 126 508 442 123 20 46 ... 60 109 2 0.324 0.278 0.362 0.475 0.837 0.373 1.85
2 NaN 김종호 2 NC 128 546 465 129 0 72 ... 57 100 50 0.352 0.277 0.376 0.333 0.709 0.339 1.55
3 NaN 나성범 3 NC 104 458 404 98 14 55 ... 33 95 12 0.279 0.243 0.319 0.416 0.735 0.329 1.50
4 NaN 조영훈 4 NC 120 426 380 107 6 38 ... 39 56 4 0.316 0.282 0.350 0.413 0.763 0.348 0.83
5 NaN 이현곤 5 NC 91 161 139 38 0 10 ... 16 14 2 0.304 0.273 0.361 0.324 0.685 0.327 0.52
6 NaN 이상호 6 NC 102 138 125 31 0 26 ... 9 21 24 0.298 0.248 0.299 0.320 0.619 0.289 0.16
7 NaN 강진성 7 NC 3 3 2 1 0 1 ... 1 0 0 0.500 0.500 0.667 1.000 1.667 0.671 0.10
8 NaN 조평호 8 NC 26 86 79 21 2 12 ... 6 24 1 0.358 0.266 0.318 0.418 0.736 0.329 0.09
9 NaN 박민우 9 NC 32 48 42 11 0 10 ... 5 7 9 0.306 0.262 0.333 0.286 0.619 0.296 0.07
10 NaN 박정준 10 NC 77 195 167 41 4 24 ... 23 44 4 0.303 0.246 0.335 0.353 0.688 0.320 0.06
11 NaN 이승호 11 NC 2 1 0 0 0 0 ... 1 0 1 - - 1.000 - - 0.712 0.06
12 NaN 마낙길 12 NC 24 31 29 9 0 5 ... 1 5 2 0.375 0.310 0.333 0.345 0.678 0.317 -0.03
13 NaN 김성욱 13 NC 4 4 4 1 0 0 ... 0 2 0 0.500 0.250 0.250 0.250 0.500 0.234 -0.03
14 NaN 강구성 14 NC 2 2 2 0 0 0 ... 0 0 0 0.000 0.000 0.000 0.000 0.000 0.000 -0.06
15 NaN 지석훈 15 NC 104 356 309 68 3 25 ... 30 82 2 0.285 0.220 0.300 0.330 0.630 0.293 -0.09
16 NaN 김종찬 16 NC 5 7 7 1 0 0 ... 0 3 0 0.250 0.143 0.143 0.143 0.286 0.134 -0.11
17 NaN 차화준 17 NC 58 121 106 24 1 18 ... 12 29 4 0.295 0.226 0.306 0.311 0.617 0.289 -0.12
18 NaN 김동건 18 NC 7 17 16 2 1 1 ... 1 7 0 0.125 0.125 0.176 0.313 0.489 0.216 -0.14
19 NaN 이창섭 19 NC 5 5 5 0 0 0 ... 0 2 0 0.000 0.000 0.000 0.000 0.000 0.000 -0.14
20 2014.0 테임즈 0 NC 125 514 443 152 37 95 ... 58 99 11 0.367 0.343 0.422 0.688 1.11 0.456 6.36
21 NaN 나성범 1 NC 123 536 477 157 30 88 ... 43 128 14 0.397 0.329 0.400 0.597 0.997 0.424 5.94
22 NaN 박민우 2 NC 118 491 416 124 1 87 ... 56 89 50 0.373 0.298 0.392 0.399 0.791 0.365 2.73
23 NaN 손시헌 3 NC 97 361 307 90 5 39 ... 34 53 2 0.331 0.293 0.368 0.414 0.782 0.349 1.52
24 NaN 지석훈 4 NC 114 238 212 58 6 26 ... 16 46 1 0.323 0.274 0.340 0.462 0.802 0.352 0.97
25 NaN 이호준 5 NC 122 500 424 115 23 59 ... 67 104 2 0.305 0.271 0.371 0.481 0.852 0.369 0.88
26 NaN 권희동 6 NC 101 252 221 63 7 39 ... 25 43 6 0.324 0.285 0.363 0.443 0.806 0.353 0.62
27 NaN 모창민 7 NC 122 468 419 110 16 62 ... 37 82 14 0.289 0.263 0.320 0.413 0.733 0.319 0.17
28 NaN 이종욱 8 NC 124 495 438 126 6 73 ... 40 60 15 0.313 0.288 0.343 0.411 0.754 0.332 0.13
29 NaN 김준완 9 NC 6 5 4 2 0 1 ... 1 1 1 0.667 0.5 0.600 0.5 1.1 0.509 0.11
30 NaN 최재원 10 NC 2 2 1 0 0 1 ... 1 1 0 - 0 0.500 0 0.5 0.363 0.01
31 NaN 마낙길 11 NC 2 2 1 0 0 1 ... 1 0 0 0.000 0 0.500 0 0.5 0.363 0.01
32 NaN 조영훈 12 NC 92 124 111 29 6 15 ... 10 26 1 0.288 0.261 0.325 0.459 0.784 0.337 -0.02
33 NaN 김태우 13 NC 4 5 5 1 0 0 ... 0 3 0 0.500 0.2 0.200 0.4 0.6 0.244 -0.03
34 NaN 박명환* 14 NC 2 1 1 0 0 0 ... 0 1 0 - 0 0.000 0 0 0.000 -0.03
35 NaN 조평호 15 NC 2 2 2 0 0 0 ... 0 0 0 0.000 0 0.000 0 0 0.000 -0.07
36 NaN 강민국 16 NC 6 3 3 0 0 0 ... 0 0 0 0.000 0 0.000 0 0 0.000 -0.10
37 NaN 허준 17 NC 28 36 29 5 0 2 ... 5 10 0 0.263 0.172 0.294 0.276 0.57 0.268 -0.11
38 NaN 김성욱 18 NC 26 26 23 4 1 6 ... 3 9 1 0.231 0.174 0.269 0.348 0.617 0.272 -0.15
39 NaN 노진혁 19 NC 25 16 16 3 1 3 ... 0 7 0 0.250 0.188 0.188 0.375 0.563 0.231 -0.18
40 2015.0 테임즈 0 NC 142 595 472 180 47 130 ... 103 91 40 0.39 0.381 0.497 0.79 1.287 0.520 11.73
41 NaN 나성범 1 NC 144 622 564 184 28 112 ... 33 127 23 0.374 0.326 0.373 0.553 0.926 0.390 4.46
42 NaN 박민우 2 NC 141 617 520 158 3 111 ... 73 108 46 0.373 0.304 0.399 0.404 0.803 0.364 3.52
43 NaN 이호준 3 NC 131 518 449 132 24 48 ... 61 102 0 0.332 0.294 0.381 0.51 0.891 0.381 2.19
44 NaN 김종호 4 NC 133 486 424 125 4 90 ... 44 65 41 0.338 0.295 0.364 0.394 0.758 0.340 1.03
45 NaN 조영훈 5 NC 103 146 124 35 8 20 ... 19 36 3 0.329 0.282 0.372 0.54 0.912 0.389 1.00
46 NaN 손시헌 6 NC 140 508 440 108 13 56 ... 36 66 3 0.26 0.245 0.319 0.398 0.717 0.316 0.85
47 NaN 이종욱 7 NC 125 504 440 118 5 63 ... 54 78 17 0.315 0.268 0.351 0.368 0.719 0.322 0.84
48 NaN 모창민 8 NC 103 239 214 62 6 23 ... 18 52 5 0.352 0.29 0.340 0.439 0.779 0.340 0.76
49 NaN 지석훈 9 NC 137 466 415 111 11 53 ... 23 85 4 0.311 0.267 0.328 0.383 0.711 0.317 0.51
50 NaN 용덕한 10 NC 50 49 42 12 0 4 ... 5 8 2 0.353 0.286 0.375 0.31 0.685 0.326 0.44
51 NaN 최재원 11 NC 114 102 85 21 2 31 ... 10 29 14 0.352 0.247 0.366 0.412 0.778 0.350 0.30
52 NaN 박정준 12 NC 19 24 21 8 0 2 ... 0 5 0 0.5 0.381 0.458 0.476 0.934 0.417 0.25
53 NaN 김태군 13 NC 144 474 421 107 6 45 ... 25 77 1 0.293 0.254 0.307 0.354 0.661 0.294 0.25
54 NaN 조평호 14 NC 22 22 22 8 1 4 ... 0 6 0 0.467 0.364 0.364 0.591 0.955 0.401 0.18
55 NaN 이창섭 15 NC 15 8 5 0 0 0 ... 3 3 0 0 0 0.375 0 0.375 0.286 -0.01
56 NaN 김준완 16 NC 30 54 44 10 0 12 ... 10 10 2 0.294 0.227 0.370 0.227 0.597 0.308 -0.04
57 NaN 강구성 17 NC 4 5 5 1 0 0 ... 0 0 0 0.2 0.2 0.200 0.4 0.6 0.242 -0.04
58 NaN 강민국 18 NC 1 2 2 0 0 0 ... 0 1 0 0 0 0.000 0 0 0.000 -0.06
59 NaN 김태진 19 NC 1 3 3 0 0 0 ... 0 0 0 0 0 0.000 0 0 0.000 -0.09

60 rows × 21 columns

In [104]:
# nc.fillna?
#method : {'backfill', 'bfill', 'pad', 'ffill', None}, default None
#    Method to use for filling holes in reindexed Series
#    pad / ffill: propagate last valid observation forward to next valid
#    backfill / bfill: use NEXT valid observation to fill gap
In [105]:
# 전향보간 방식의 옵션을 지정해서 채운다. 
nc['시즌'].fillna(method='ffill')
Out[105]:
0     2013.0
1     2013.0
2     2013.0
3     2013.0
4     2013.0
5     2013.0
6     2013.0
7     2013.0
8     2013.0
9     2013.0
10    2013.0
11    2013.0
12    2013.0
13    2013.0
14    2013.0
15    2013.0
16    2013.0
17    2013.0
18    2013.0
19    2013.0
20    2014.0
21    2014.0
22    2014.0
23    2014.0
24    2014.0
25    2014.0
26    2014.0
27    2014.0
28    2014.0
29    2014.0
30    2014.0
31    2014.0
32    2014.0
33    2014.0
34    2014.0
35    2014.0
36    2014.0
37    2014.0
38    2014.0
39    2014.0
40    2015.0
41    2015.0
42    2015.0
43    2015.0
44    2015.0
45    2015.0
46    2015.0
47    2015.0
48    2015.0
49    2015.0
50    2015.0
51    2015.0
52    2015.0
53    2015.0
54    2015.0
55    2015.0
56    2015.0
57    2015.0
58    2015.0
59    2015.0
Name: 시즌, dtype: float64
In [106]:
# 전향보간 방식의 옵션을 지정채우고 다시 스즌에 업데이트
nc['시즌'] = nc['시즌'].fillna(method='ffill')
nc
Out[106]:
시즌 선수명 index 팀명 경기 타석 타수 안타 홈런 득점 ... 볼넷 삼진 도루 BABIP 타율 출루율 장타율 OPS wOBA WAR
0 2013.0 모창민 0 NC 108 436 395 109 12 57 ... 37 68 16 0.307 0.276 0.339 0.443 0.782 0.353 2.31
1 2013.0 이호준 1 NC 126 508 442 123 20 46 ... 60 109 2 0.324 0.278 0.362 0.475 0.837 0.373 1.85
2 2013.0 김종호 2 NC 128 546 465 129 0 72 ... 57 100 50 0.352 0.277 0.376 0.333 0.709 0.339 1.55
3 2013.0 나성범 3 NC 104 458 404 98 14 55 ... 33 95 12 0.279 0.243 0.319 0.416 0.735 0.329 1.50
4 2013.0 조영훈 4 NC 120 426 380 107 6 38 ... 39 56 4 0.316 0.282 0.350 0.413 0.763 0.348 0.83
5 2013.0 이현곤 5 NC 91 161 139 38 0 10 ... 16 14 2 0.304 0.273 0.361 0.324 0.685 0.327 0.52
6 2013.0 이상호 6 NC 102 138 125 31 0 26 ... 9 21 24 0.298 0.248 0.299 0.320 0.619 0.289 0.16
7 2013.0 강진성 7 NC 3 3 2 1 0 1 ... 1 0 0 0.500 0.500 0.667 1.000 1.667 0.671 0.10
8 2013.0 조평호 8 NC 26 86 79 21 2 12 ... 6 24 1 0.358 0.266 0.318 0.418 0.736 0.329 0.09
9 2013.0 박민우 9 NC 32 48 42 11 0 10 ... 5 7 9 0.306 0.262 0.333 0.286 0.619 0.296 0.07
10 2013.0 박정준 10 NC 77 195 167 41 4 24 ... 23 44 4 0.303 0.246 0.335 0.353 0.688 0.320 0.06
11 2013.0 이승호 11 NC 2 1 0 0 0 0 ... 1 0 1 - - 1.000 - - 0.712 0.06
12 2013.0 마낙길 12 NC 24 31 29 9 0 5 ... 1 5 2 0.375 0.310 0.333 0.345 0.678 0.317 -0.03
13 2013.0 김성욱 13 NC 4 4 4 1 0 0 ... 0 2 0 0.500 0.250 0.250 0.250 0.500 0.234 -0.03
14 2013.0 강구성 14 NC 2 2 2 0 0 0 ... 0 0 0 0.000 0.000 0.000 0.000 0.000 0.000 -0.06
15 2013.0 지석훈 15 NC 104 356 309 68 3 25 ... 30 82 2 0.285 0.220 0.300 0.330 0.630 0.293 -0.09
16 2013.0 김종찬 16 NC 5 7 7 1 0 0 ... 0 3 0 0.250 0.143 0.143 0.143 0.286 0.134 -0.11
17 2013.0 차화준 17 NC 58 121 106 24 1 18 ... 12 29 4 0.295 0.226 0.306 0.311 0.617 0.289 -0.12
18 2013.0 김동건 18 NC 7 17 16 2 1 1 ... 1 7 0 0.125 0.125 0.176 0.313 0.489 0.216 -0.14
19 2013.0 이창섭 19 NC 5 5 5 0 0 0 ... 0 2 0 0.000 0.000 0.000 0.000 0.000 0.000 -0.14
20 2014.0 테임즈 0 NC 125 514 443 152 37 95 ... 58 99 11 0.367 0.343 0.422 0.688 1.11 0.456 6.36
21 2014.0 나성범 1 NC 123 536 477 157 30 88 ... 43 128 14 0.397 0.329 0.400 0.597 0.997 0.424 5.94
22 2014.0 박민우 2 NC 118 491 416 124 1 87 ... 56 89 50 0.373 0.298 0.392 0.399 0.791 0.365 2.73
23 2014.0 손시헌 3 NC 97 361 307 90 5 39 ... 34 53 2 0.331 0.293 0.368 0.414 0.782 0.349 1.52
24 2014.0 지석훈 4 NC 114 238 212 58 6 26 ... 16 46 1 0.323 0.274 0.340 0.462 0.802 0.352 0.97
25 2014.0 이호준 5 NC 122 500 424 115 23 59 ... 67 104 2 0.305 0.271 0.371 0.481 0.852 0.369 0.88
26 2014.0 권희동 6 NC 101 252 221 63 7 39 ... 25 43 6 0.324 0.285 0.363 0.443 0.806 0.353 0.62
27 2014.0 모창민 7 NC 122 468 419 110 16 62 ... 37 82 14 0.289 0.263 0.320 0.413 0.733 0.319 0.17
28 2014.0 이종욱 8 NC 124 495 438 126 6 73 ... 40 60 15 0.313 0.288 0.343 0.411 0.754 0.332 0.13
29 2014.0 김준완 9 NC 6 5 4 2 0 1 ... 1 1 1 0.667 0.5 0.600 0.5 1.1 0.509 0.11
30 2014.0 최재원 10 NC 2 2 1 0 0 1 ... 1 1 0 - 0 0.500 0 0.5 0.363 0.01
31 2014.0 마낙길 11 NC 2 2 1 0 0 1 ... 1 0 0 0.000 0 0.500 0 0.5 0.363 0.01
32 2014.0 조영훈 12 NC 92 124 111 29 6 15 ... 10 26 1 0.288 0.261 0.325 0.459 0.784 0.337 -0.02
33 2014.0 김태우 13 NC 4 5 5 1 0 0 ... 0 3 0 0.500 0.2 0.200 0.4 0.6 0.244 -0.03
34 2014.0 박명환* 14 NC 2 1 1 0 0 0 ... 0 1 0 - 0 0.000 0 0 0.000 -0.03
35 2014.0 조평호 15 NC 2 2 2 0 0 0 ... 0 0 0 0.000 0 0.000 0 0 0.000 -0.07
36 2014.0 강민국 16 NC 6 3 3 0 0 0 ... 0 0 0 0.000 0 0.000 0 0 0.000 -0.10
37 2014.0 허준 17 NC 28 36 29 5 0 2 ... 5 10 0 0.263 0.172 0.294 0.276 0.57 0.268 -0.11
38 2014.0 김성욱 18 NC 26 26 23 4 1 6 ... 3 9 1 0.231 0.174 0.269 0.348 0.617 0.272 -0.15
39 2014.0 노진혁 19 NC 25 16 16 3 1 3 ... 0 7 0 0.250 0.188 0.188 0.375 0.563 0.231 -0.18
40 2015.0 테임즈 0 NC 142 595 472 180 47 130 ... 103 91 40 0.39 0.381 0.497 0.79 1.287 0.520 11.73
41 2015.0 나성범 1 NC 144 622 564 184 28 112 ... 33 127 23 0.374 0.326 0.373 0.553 0.926 0.390 4.46
42 2015.0 박민우 2 NC 141 617 520 158 3 111 ... 73 108 46 0.373 0.304 0.399 0.404 0.803 0.364 3.52
43 2015.0 이호준 3 NC 131 518 449 132 24 48 ... 61 102 0 0.332 0.294 0.381 0.51 0.891 0.381 2.19
44 2015.0 김종호 4 NC 133 486 424 125 4 90 ... 44 65 41 0.338 0.295 0.364 0.394 0.758 0.340 1.03
45 2015.0 조영훈 5 NC 103 146 124 35 8 20 ... 19 36 3 0.329 0.282 0.372 0.54 0.912 0.389 1.00
46 2015.0 손시헌 6 NC 140 508 440 108 13 56 ... 36 66 3 0.26 0.245 0.319 0.398 0.717 0.316 0.85
47 2015.0 이종욱 7 NC 125 504 440 118 5 63 ... 54 78 17 0.315 0.268 0.351 0.368 0.719 0.322 0.84
48 2015.0 모창민 8 NC 103 239 214 62 6 23 ... 18 52 5 0.352 0.29 0.340 0.439 0.779 0.340 0.76
49 2015.0 지석훈 9 NC 137 466 415 111 11 53 ... 23 85 4 0.311 0.267 0.328 0.383 0.711 0.317 0.51
50 2015.0 용덕한 10 NC 50 49 42 12 0 4 ... 5 8 2 0.353 0.286 0.375 0.31 0.685 0.326 0.44
51 2015.0 최재원 11 NC 114 102 85 21 2 31 ... 10 29 14 0.352 0.247 0.366 0.412 0.778 0.350 0.30
52 2015.0 박정준 12 NC 19 24 21 8 0 2 ... 0 5 0 0.5 0.381 0.458 0.476 0.934 0.417 0.25
53 2015.0 김태군 13 NC 144 474 421 107 6 45 ... 25 77 1 0.293 0.254 0.307 0.354 0.661 0.294 0.25
54 2015.0 조평호 14 NC 22 22 22 8 1 4 ... 0 6 0 0.467 0.364 0.364 0.591 0.955 0.401 0.18
55 2015.0 이창섭 15 NC 15 8 5 0 0 0 ... 3 3 0 0 0 0.375 0 0.375 0.286 -0.01
56 2015.0 김준완 16 NC 30 54 44 10 0 12 ... 10 10 2 0.294 0.227 0.370 0.227 0.597 0.308 -0.04
57 2015.0 강구성 17 NC 4 5 5 1 0 0 ... 0 0 0 0.2 0.2 0.200 0.4 0.6 0.242 -0.04
58 2015.0 강민국 18 NC 1 2 2 0 0 0 ... 0 1 0 0 0 0.000 0 0 0.000 -0.06
59 2015.0 김태진 19 NC 1 3 3 0 0 0 ... 0 0 0 0 0 0.000 0 0 0.000 -0.09

60 rows × 21 columns

색인(Index)

계층색인과 색인,칼럼 스위칭

In [107]:
#계층색인(2개 이상의 칼럼 리스트를 색으로 사용)
nc = nc.set_index(['시즌', '선수명'])
안타홈런 = nc[['안타', '홈런']]
안타홈런
Out[107]:
안타 홈런
시즌 선수명
2013.0 모창민 109 12
이호준 123 20
김종호 129 0
나성범 98 14
조영훈 107 6
이현곤 38 0
이상호 31 0
강진성 1 0
조평호 21 2
박민우 11 0
박정준 41 4
이승호 0 0
마낙길 9 0
김성욱 1 0
강구성 0 0
지석훈 68 3
김종찬 1 0
차화준 24 1
김동건 2 1
이창섭 0 0
2014.0 테임즈 152 37
나성범 157 30
박민우 124 1
손시헌 90 5
지석훈 58 6
이호준 115 23
권희동 63 7
모창민 110 16
이종욱 126 6
김준완 2 0
최재원 0 0
마낙길 0 0
조영훈 29 6
김태우 1 0
박명환* 0 0
조평호 0 0
강민국 0 0
허준 5 0
김성욱 4 1
노진혁 3 1
2015.0 테임즈 180 47
나성범 184 28
박민우 158 3
이호준 132 24
김종호 125 4
조영훈 35 8
손시헌 108 13
이종욱 118 5
모창민 62 6
지석훈 111 11
용덕한 12 0
최재원 21 2
박정준 8 0
김태군 107 6
조평호 8 1
이창섭 0 0
김준완 10 0
강구성 1 0
강민국 0 0
김태진 0 0
In [108]:
# 계층색인으로 리인덱싱
테나 = 안타홈런.reindex(['테임즈', '나성범'], level='선수명')
테나
Out[108]:
안타 홈런
시즌 선수명
2013.0 나성범 98 14
2014.0 테임즈 152 37
나성범 157 30
2015.0 테임즈 180 47
나성범 184 28
In [109]:
# unstack: 지정된 칼럼의 값을 열로 재배치
테나.unstack('시즌')
Out[109]:
안타 홈런
시즌 2013.0 2014.0 2015.0 2013.0 2014.0 2015.0
선수명
테임즈 NaN 152.0 180.0 NaN 37.0 47.0
나성범 98.0 157.0 184.0 14.0 30.0 28.0
In [110]:
테나.unstack('선수명')
Out[110]:
안타 홈런
선수명 테임즈 나성범 테임즈 나성범
시즌
2013.0 NaN 98.0 NaN 14.0
2014.0 152.0 157.0 37.0 30.0
2015.0 180.0 184.0 47.0 28.0

시리즈의 정수 색인

In [111]:
ser = Series(['a', 'b', 'c'], index=[3,2,1])
In [112]:
ser
Out[112]:
3    a
2    b
1    c
dtype: object
In [113]:
# 정수 색인의 모호함. (순서인지 인덱스 값인지를 모호하다.)
ser[1]
# 색인이 1인 것을 가져온다. 두번째 원소를 선택하고자 한다면....
Out[113]:
'c'
In [114]:
# 두번째 항목을 선택하기 위해서 iloc 사용.
ser.iloc[1]
Out[114]:
'b'
In [115]:
## 따라서 색인은 정수라고 하더라도 값으로 인식하는 것이 좋다. 
# python for data analysis 213페이지 참조

pandas의 read_csv/read_table의 함수 인자.

read_csv 사용하기

특정행 스킵 후 읽기

In [126]:
# 포멧이 ... 일정치 않은 경우 
pd.read_csv('data/ex4.csv')
Out[126]:
# hey!
a b c d message
# just wanted to make things more difficult for you NaN NaN NaN NaN
# who reads CSV files with computers anyway? NaN NaN NaN
1 2 3 4 hello
5 6 7 8 world
9 10 11 12 foo
In [127]:
# 특정행을 스킵
pd.read_csv('data/ex4.csv', skiprows=[0,2,3])
Out[127]:
a b c d message
0 1 2 3 4 hello
1 5 6 7 8 world
2 9 10 11 12 foo
In [128]:
# 주석 처리 comment : #으로 시작하는 행 스킵
pd.read_csv('data/ex4.csv', comment='#')
Out[128]:
a b c d message
0 1 2 3 4 hello
1 5 6 7 8 world
2 9 10 11 12 foo

파일의 용량이 매우 클때

  • 조금씩 읽어 오기
In [129]:
# nrows 옵션: 지정된 행의 수만큼만 읽어 온다. 
pd.read_csv('data/us_presidental.csv', nrows=5)
Out[129]:
cmte_id cand_id cand_nm contbr_nm contbr_city contbr_st contbr_zip contbr_employer contbr_occupation contb_receipt_amt contb_receipt_dt receipt_desc memo_cd memo_text form_tp file_num
0 C00410118 P20002978 Bachmann, Michelle HARVEY, WILLIAM MOBILE AL 366010290 RETIRED RETIRED 250 20-JUN-11 NaN NaN NaN SA17A 736166
1 C00410118 P20002978 Bachmann, Michelle HARVEY, WILLIAM MOBILE AL 366010290 RETIRED RETIRED 50 23-JUN-11 NaN NaN NaN SA17A 736166
2 C00410118 P20002978 Bachmann, Michelle SMITH, LANIER LANETT AL 368633403 INFORMATION REQUESTED INFORMATION REQUESTED 250 05-JUL-11 NaN NaN NaN SA17A 749073
3 C00410118 P20002978 Bachmann, Michelle BLEVINS, DARONDA PIGGOTT AR 724548253 NONE RETIRED 250 01-AUG-11 NaN NaN NaN SA17A 749073
4 C00410118 P20002978 Bachmann, Michelle WARDENBURG, HAROLD HOT SPRINGS NATION AR 719016467 NONE RETIRED 300 20-JUN-11 NaN NaN NaN SA17A 736166
In [130]:
# chunksize 옵션: 여러조각으로 나누어서 읽고자 할때 : 단위는 행의 갯수...
chunker = pd.read_csv('data/us_presidental.csv', chunksize=1000)
chunker
Out[130]:
<pandas.io.parsers.TextFileReader at 0x2e3b2194c18>
In [131]:
## chunker에서 하나씩 꺼내서 사용 한다. chunker는 TextFileReader 객체이다. 
## 아래와 같이 루프를 돌면서 파일을 1000개 라인씩 읽으면서 처리 한다. 
for frame in chunker:
    pass

엑셀에서 데이터 읽어 오기

  • read_excel() 함수 사용
  • 텍스트 파일과는 다르게 sheet가 여러개 있다는 점에 주의를 해야 한다.
  • 인코딩은 신경쓸 필요가 없다.
  • 구분자를 신경쓸 필요가 없다.
In [132]:
pd.read_excel('data/NC Dinos.xlsx')
# 이렇게 실행하면 첫번째 sheet만 읽어 온다. 
Out[132]:
Unnamed: 0 선수명 팀명 경기 타석 타수 안타 홈런 득점 타점 볼넷 삼진 도루 BABIP 타율 출루율 장타율 OPS wOBA WAR
0 0 모창민 NC 108 436 395 109 12 57 51 37 68 16 0.307 0.276 0.339 0.443 0.782 0.353 2.31
1 1 이호준 NC 126 508 442 123 20 46 87 60 109 2 0.324 0.278 0.362 0.475 0.837 0.373 1.85
2 2 김종호 NC 128 546 465 129 0 72 22 57 100 50 0.352 0.277 0.376 0.333 0.709 0.339 1.55
3 3 나성범 NC 104 458 404 98 14 55 64 33 95 12 0.279 0.243 0.319 0.416 0.735 0.329 1.50
4 4 조영훈 NC 120 426 380 107 6 38 39 39 56 4 0.316 0.282 0.350 0.413 0.763 0.348 0.83
5 5 이현곤 NC 91 161 139 38 0 10 9 16 14 2 0.304 0.273 0.361 0.324 0.685 0.327 0.52
6 6 이상호 NC 102 138 125 31 0 26 13 9 21 24 0.298 0.248 0.299 0.320 0.619 0.289 0.16
7 7 강진성 NC 3 3 2 1 0 1 0 1 0 0 0.500 0.500 0.667 1.000 1.667 0.671 0.10
8 8 조평호 NC 26 86 79 21 2 12 7 6 24 1 0.358 0.266 0.318 0.418 0.736 0.329 0.09
9 9 박민우 NC 32 48 42 11 0 10 6 5 7 9 0.306 0.262 0.333 0.286 0.619 0.296 0.07
10 10 박정준 NC 77 195 167 41 4 24 21 23 44 4 0.303 0.246 0.335 0.353 0.688 0.320 0.06
11 11 이승호 NC 2 1 0 0 0 0 0 1 0 1 - - 1.000 - - 0.712 0.06
12 12 마낙길 NC 24 31 29 9 0 5 0 1 5 2 0.375 0.310 0.333 0.345 0.678 0.317 -0.03
13 13 김성욱 NC 4 4 4 1 0 0 1 0 2 0 0.500 0.250 0.250 0.250 0.500 0.234 -0.03
14 14 강구성 NC 2 2 2 0 0 0 0 0 0 0 0.000 0.000 0.000 0.000 0.000 0.000 -0.06
15 15 지석훈 NC 104 356 309 68 3 25 35 30 82 2 0.285 0.220 0.300 0.330 0.630 0.293 -0.09
16 16 김종찬 NC 5 7 7 1 0 0 0 0 3 0 0.250 0.143 0.143 0.143 0.286 0.134 -0.11
17 17 차화준 NC 58 121 106 24 1 18 7 12 29 4 0.295 0.226 0.306 0.311 0.617 0.289 -0.12
18 18 김동건 NC 7 17 16 2 1 1 1 1 7 0 0.125 0.125 0.176 0.313 0.489 0.216 -0.14
19 19 이창섭 NC 5 5 5 0 0 0 0 0 2 0 0.000 0.000 0.000 0.000 0.000 0.000 -0.14
In [133]:
# 여러 sheet읽어 오기 (sheetname 옵션을 사용, 특정 sheet이름을 작성하거나 
# None으로 해서 모든 sheet를 읽어 올 수 있다. )
sheets = pd.read_excel('data/NC Dinos.xlsx', sheetname=None)
C:\ProgramData\Anaconda3\lib\site-packages\pandas\util\_decorators.py:188: FutureWarning: The `sheetname` keyword is deprecated, use `sheet_name` instead
  return func(*args, **kwargs)
In [134]:
type(sheets)
Out[134]:
collections.OrderedDict
In [135]:
# 2015 시트 가져오기.
sheets['2015'][:10]
Out[135]:
Unnamed: 0 선수명 팀명 경기 타석 타수 안타 홈런 득점 타점 볼넷 삼진 도루 BABIP 타율 출루율 장타율 OPS wOBA WAR
0 0 테임즈 NC 142 595 472 180 47 130 140 103 91 40 0.390 0.381 0.497 0.790 1.287 0.520 11.73
1 1 나성범 NC 144 622 564 184 28 112 135 33 127 23 0.374 0.326 0.373 0.553 0.926 0.390 4.46
2 2 박민우 NC 141 617 520 158 3 111 47 73 108 46 0.373 0.304 0.399 0.404 0.803 0.364 3.52
3 3 이호준 NC 131 518 449 132 24 48 110 61 102 0 0.332 0.294 0.381 0.510 0.891 0.381 2.19
4 4 김종호 NC 133 486 424 125 4 90 36 44 65 41 0.338 0.295 0.364 0.394 0.758 0.340 1.03
5 5 조영훈 NC 103 146 124 35 8 20 35 19 36 3 0.329 0.282 0.372 0.540 0.912 0.389 1.00
6 6 손시헌 NC 140 508 440 108 13 56 58 36 66 3 0.260 0.245 0.319 0.398 0.717 0.316 0.85
7 7 이종욱 NC 125 504 440 118 5 63 52 54 78 17 0.315 0.268 0.351 0.368 0.719 0.322 0.84
8 8 모창민 NC 103 239 214 62 6 23 35 18 52 5 0.352 0.290 0.340 0.439 0.779 0.340 0.76
9 9 지석훈 NC 137 466 415 111 11 53 46 23 85 4 0.311 0.267 0.328 0.383 0.711 0.317 0.51
In [136]:
# 시트 합치기
pd.concat(sheets)
Out[136]:
Unnamed: 0 선수명 팀명 경기 타석 타수 안타 홈런 득점 타점 볼넷 삼진 도루 BABIP 타율 출루율 장타율 OPS wOBA WAR
2013 0 0 모창민 NC 108 436 395 109 12 57 51 37 68 16 0.307 0.276 0.339 0.443 0.782 0.353 2.31
1 1 이호준 NC 126 508 442 123 20 46 87 60 109 2 0.324 0.278 0.362 0.475 0.837 0.373 1.85
2 2 김종호 NC 128 546 465 129 0 72 22 57 100 50 0.352 0.277 0.376 0.333 0.709 0.339 1.55
3 3 나성범 NC 104 458 404 98 14 55 64 33 95 12 0.279 0.243 0.319 0.416 0.735 0.329 1.50
4 4 조영훈 NC 120 426 380 107 6 38 39 39 56 4 0.316 0.282 0.350 0.413 0.763 0.348 0.83
5 5 이현곤 NC 91 161 139 38 0 10 9 16 14 2 0.304 0.273 0.361 0.324 0.685 0.327 0.52
6 6 이상호 NC 102 138 125 31 0 26 13 9 21 24 0.298 0.248 0.299 0.320 0.619 0.289 0.16
7 7 강진성 NC 3 3 2 1 0 1 0 1 0 0 0.500 0.500 0.667 1.000 1.667 0.671 0.10
8 8 조평호 NC 26 86 79 21 2 12 7 6 24 1 0.358 0.266 0.318 0.418 0.736 0.329 0.09
9 9 박민우 NC 32 48 42 11 0 10 6 5 7 9 0.306 0.262 0.333 0.286 0.619 0.296 0.07
10 10 박정준 NC 77 195 167 41 4 24 21 23 44 4 0.303 0.246 0.335 0.353 0.688 0.320 0.06
11 11 이승호 NC 2 1 0 0 0 0 0 1 0 1 - - 1.000 - - 0.712 0.06
12 12 마낙길 NC 24 31 29 9 0 5 0 1 5 2 0.375 0.310 0.333 0.345 0.678 0.317 -0.03
13 13 김성욱 NC 4 4 4 1 0 0 1 0 2 0 0.500 0.250 0.250 0.250 0.500 0.234 -0.03
14 14 강구성 NC 2 2 2 0 0 0 0 0 0 0 0.000 0.000 0.000 0.000 0.000 0.000 -0.06
15 15 지석훈 NC 104 356 309 68 3 25 35 30 82 2 0.285 0.220 0.300 0.330 0.630 0.293 -0.09
16 16 김종찬 NC 5 7 7 1 0 0 0 0 3 0 0.250 0.143 0.143 0.143 0.286 0.134 -0.11
17 17 차화준 NC 58 121 106 24 1 18 7 12 29 4 0.295 0.226 0.306 0.311 0.617 0.289 -0.12
18 18 김동건 NC 7 17 16 2 1 1 1 1 7 0 0.125 0.125 0.176 0.313 0.489 0.216 -0.14
19 19 이창섭 NC 5 5 5 0 0 0 0 0 2 0 0.000 0.000 0.000 0.000 0.000 0.000 -0.14
2014 0 0 테임즈 NC 125 514 443 152 37 95 121 58 99 11 0.367 0.343 0.422 0.688 1.11 0.456 6.36
1 1 나성범 NC 123 536 477 157 30 88 101 43 128 14 0.397 0.329 0.400 0.597 0.997 0.424 5.94
2 2 박민우 NC 118 491 416 124 1 87 40 56 89 50 0.373 0.298 0.392 0.399 0.791 0.365 2.73
3 3 손시헌 NC 97 361 307 90 5 39 39 34 53 2 0.331 0.293 0.368 0.414 0.782 0.349 1.52
4 4 지석훈 NC 114 238 212 58 6 26 34 16 46 1 0.323 0.274 0.340 0.462 0.802 0.352 0.97
5 5 이호준 NC 122 500 424 115 23 59 78 67 104 2 0.305 0.271 0.371 0.481 0.852 0.369 0.88
6 6 권희동 NC 101 252 221 63 7 39 36 25 43 6 0.324 0.285 0.363 0.443 0.806 0.353 0.62
7 7 모창민 NC 122 468 419 110 16 62 72 37 82 14 0.289 0.263 0.320 0.413 0.733 0.319 0.17
8 8 이종욱 NC 124 495 438 126 6 73 79 40 60 15 0.313 0.288 0.343 0.411 0.754 0.332 0.13
9 9 김준완 NC 6 5 4 2 0 1 0 1 1 1 0.667 0.5 0.600 0.5 1.1 0.509 0.11
10 10 최재원 NC 2 2 1 0 0 1 0 1 1 0 - 0 0.500 0 0.5 0.363 0.01
11 11 마낙길 NC 2 2 1 0 0 1 0 1 0 0 0.000 0 0.500 0 0.5 0.363 0.01
12 12 조영훈 NC 92 124 111 29 6 15 22 10 26 1 0.288 0.261 0.325 0.459 0.784 0.337 -0.02
13 13 김태우 NC 4 5 5 1 0 0 0 0 3 0 0.500 0.2 0.200 0.4 0.6 0.244 -0.03
14 14 박명환* NC 2 1 1 0 0 0 0 0 1 0 - 0 0.000 0 0 0.000 -0.03
15 15 조평호 NC 2 2 2 0 0 0 0 0 0 0 0.000 0 0.000 0 0 0.000 -0.07
16 16 강민국 NC 6 3 3 0 0 0 0 0 0 0 0.000 0 0.000 0 0 0.000 -0.10
17 17 허준 NC 28 36 29 5 0 2 1 5 10 0 0.263 0.172 0.294 0.276 0.57 0.268 -0.11
18 18 김성욱 NC 26 26 23 4 1 6 1 3 9 1 0.231 0.174 0.269 0.348 0.617 0.272 -0.15
19 19 노진혁 NC 25 16 16 3 1 3 2 0 7 0 0.250 0.188 0.188 0.375 0.563 0.231 -0.18
2015 0 0 테임즈 NC 142 595 472 180 47 130 140 103 91 40 0.39 0.381 0.497 0.79 1.287 0.520 11.73
1 1 나성범 NC 144 622 564 184 28 112 135 33 127 23 0.374 0.326 0.373 0.553 0.926 0.390 4.46
2 2 박민우 NC 141 617 520 158 3 111 47 73 108 46 0.373 0.304 0.399 0.404 0.803 0.364 3.52
3 3 이호준 NC 131 518 449 132 24 48 110 61 102 0 0.332 0.294 0.381 0.51 0.891 0.381 2.19
4 4 김종호 NC 133 486 424 125 4 90 36 44 65 41 0.338 0.295 0.364 0.394 0.758 0.340 1.03
5 5 조영훈 NC 103 146 124 35 8 20 35 19 36 3 0.329 0.282 0.372 0.54 0.912 0.389 1.00
6 6 손시헌 NC 140 508 440 108 13 56 58 36 66 3 0.26 0.245 0.319 0.398 0.717 0.316 0.85
7 7 이종욱 NC 125 504 440 118 5 63 52 54 78 17 0.315 0.268 0.351 0.368 0.719 0.322 0.84
8 8 모창민 NC 103 239 214 62 6 23 35 18 52 5 0.352 0.29 0.340 0.439 0.779 0.340 0.76
9 9 지석훈 NC 137 466 415 111 11 53 46 23 85 4 0.311 0.267 0.328 0.383 0.711 0.317 0.51
10 10 용덕한 NC 50 49 42 12 0 4 5 5 8 2 0.353 0.286 0.375 0.31 0.685 0.326 0.44
11 11 최재원 NC 114 102 85 21 2 31 13 10 29 14 0.352 0.247 0.366 0.412 0.778 0.350 0.30
12 12 박정준 NC 19 24 21 8 0 2 2 0 5 0 0.5 0.381 0.458 0.476 0.934 0.417 0.25
13 13 김태군 NC 144 474 421 107 6 45 52 25 77 1 0.293 0.254 0.307 0.354 0.661 0.294 0.25
14 14 조평호 NC 22 22 22 8 1 4 3 0 6 0 0.467 0.364 0.364 0.591 0.955 0.401 0.18
15 15 이창섭 NC 15 8 5 0 0 0 0 3 3 0 0 0 0.375 0 0.375 0.286 -0.01
16 16 김준완 NC 30 54 44 10 0 12 2 10 10 2 0.294 0.227 0.370 0.227 0.597 0.308 -0.04
17 17 강구성 NC 4 5 5 1 0 0 0 0 0 0 0.2 0.2 0.200 0.4 0.6 0.242 -0.04
18 18 강민국 NC 1 2 2 0 0 0 0 0 1 0 0 0 0.000 0 0 0.000 -0.06
19 19 김태진 NC 1 3 3 0 0 0 0 0 0 0 0 0 0.000 0 0 0.000 -0.09
In [137]:
## 한 파일에 여러 sheet로 나누어서 저장하기.
nc13, nc14, nc15 = sheets.values()
In [138]:
# 빈 excel 파일을 하나 생성 한다. 
writer = pd.ExcelWriter('NC sheets.xlsx')
for 시트명, 프레임 in sheets.items():
    프레임.to_excel(writer, 시트명)
# 오픈된 파일을 close 한다. (반.드.시.)    
writer.close()    

Json 데이터 로딩

In [148]:
pd.read_json('data/foods-2011-10-03.json')
Out[148]:
description group id manufacturer nutrients portions tags
0 Cheese, caraway Dairy and Egg Products 1008 [{'value': 25.18, 'units': 'g', 'description':... [{'amount': 1, 'unit': 'oz', 'grams': 28.35}] []
1 Cheese, cheddar Dairy and Egg Products 1009 [{'value': 24.9, 'units': 'g', 'description': ... [{'amount': 1, 'unit': 'cup, diced', 'grams': ... []
2 Cheese, edam Dairy and Egg Products 1018 [{'value': 4.22, 'units': 'g', 'description': ... [{'amount': 1, 'unit': 'oz', 'grams': 28.35}, ... []
3 Cheese, feta Dairy and Egg Products 1019 [{'value': 5.2, 'units': 'g', 'description': '... [{'amount': 1, 'unit': 'cup, crumbled', 'grams... []
4 Cheese, mozzarella, part skim milk Dairy and Egg Products 1028 [{'value': 3.27, 'units': 'g', 'description': ... [{'amount': 1, 'unit': 'oz', 'grams': 28.35}] []
5 Cheese, mozzarella, part skim milk, low moisture Dairy and Egg Products 1029 [{'value': 3.7199999999999998, 'units': 'g', '... [{'amount': 1, 'unit': 'cup, diced', 'grams': ... []
6 Cheese, romano Dairy and Egg Products 1038 [{'value': 31.8, 'units': 'g', 'description': ... [{'amount': 1, 'unit': 'oz', 'grams': 28.35}, ... []
7 Cheese, roquefort Dairy and Egg Products 1039 [{'value': 21.54, 'units': 'g', 'description':... [{'amount': 1, 'unit': 'oz', 'grams': 28.35}, ... []
8 Cheese spread, pasteurized process, american, ... Dairy and Egg Products 1048 [{'value': 16.41, 'units': 'g', 'description':... [{'amount': 1, 'unit': 'cup, diced', 'grams': ... []
9 Cream, fluid, half and half Dairy and Egg Products 1049 [{'value': 2.96, 'units': 'g', 'description': ... [{'amount': 1, 'unit': 'cup', 'grams': 242.0},... []
10 Sour dressing, non-butterfat, cultured, filled... Dairy and Egg Products 1058 [{'value': 3.25, 'units': 'g', 'description': ... [{'amount': 1, 'unit': 'cup', 'grams': 235.0},... []
11 Milk, filled, fluid, with blend of hydrogenate... Dairy and Egg Products 1059 [{'value': 3.33, 'units': 'g', 'description': ... [{'amount': 1, 'unit': 'cup', 'grams': 244.0},... []
12 Cream substitute, liquid, with lauric acid oil... Dairy and Egg Products 1068 [{'value': 1.0, 'units': 'g', 'description': '... [{'amount': 1, 'unit': 'container, individual'... []
13 Cream substitute, powdered Dairy and Egg Products 1069 [{'value': 4.79, 'units': 'g', 'description': ... [{'amount': 1, 'unit': 'cup', 'grams': 94.0}, ... []
14 Milk, producer, fluid, 3.7% milkfat Dairy and Egg Products 1078 [{'value': 3.2800000000000002, 'units': 'g', '... [{'amount': 1, 'unit': 'cup', 'grams': 244.0},... []
15 Milk, reduced fat, fluid, 2% milkfat, with add... Dairy and Egg Products 1079 None [{'value': 3.3, 'units': 'g', 'description': '... [{'amount': 1, 'unit': 'cup', 'grams': 244.0},... []
16 Milk, reduced fat, fluid, 2% milkfat, with add... Dairy and Egg Products 1080 [{'value': 3.48, 'units': 'g', 'description': ... [{'amount': 1, 'unit': 'cup', 'grams': 245.0},... []
17 Milk, reduced fat, fluid, 2% milkfat, protein ... Dairy and Egg Products 1081 [{'value': 3.95, 'units': 'g', 'description': ... [{'amount': 1, 'unit': 'cup', 'grams': 246.0},... []
18 Milk, lowfat, fluid, 1% milkfat, with added vi... Dairy and Egg Products 1082 [{'value': 3.37, 'units': 'g', 'description': ... [{'amount': 1, 'unit': 'cup', 'grams': 244.0},... []
19 Milk, lowfat, fluid, 1% milkfat, with added no... Dairy and Egg Products 1083 [{'value': 3.48, 'units': 'g', 'description': ... [{'amount': 1, 'unit': 'cup', 'grams': 245.0},... []
20 Milk, lowfat, fluid, 1% milkfat, protein forti... Dairy and Egg Products 1084 [{'value': 3.93, 'units': 'g', 'description': ... [{'amount': 1, 'unit': 'cup', 'grams': 246.0},... []
21 Milk, nonfat, fluid, with added vitamin A and ... Dairy and Egg Products 1085 [{'value': 3.37, 'units': 'g', 'description': ... [{'amount': 1, 'unit': 'cup', 'grams': 245.0},... []
22 Milk, nonfat, fluid, with added nonfat milk so... Dairy and Egg Products 1086 [{'value': 3.5700000000000003, 'units': 'g', '... [{'amount': 1, 'unit': 'cup', 'grams': 245.0},... []
23 Milk, nonfat, fluid, protein fortified, with a... Dairy and Egg Products 1087 [{'value': 3.96, 'units': 'g', 'description': ... [{'amount': 1, 'unit': 'cup', 'grams': 246.0},... []
24 Milk, buttermilk, fluid, cultured, lowfat Dairy and Egg Products 1088 [{'value': 3.31, 'units': 'g', 'description': ... [{'amount': 1, 'unit': 'cup', 'grams': 245.0},... []
25 Milk, low sodium, fluid Dairy and Egg Products 1089 [{'value': 3.1, 'units': 'g', 'description': '... [{'amount': 1, 'unit': 'cup', 'grams': 244.0},... []
26 Milk, dry, whole, with added vitamin D Dairy and Egg Products 1090 [{'value': 26.32, 'units': 'g', 'description':... [{'amount': 1, 'unit': 'cup', 'grams': 128.0},... []
27 Milk, dry, nonfat, regular, without added vita... Dairy and Egg Products 1091 [{'value': 36.16, 'units': 'g', 'description':... [{'amount': 1, 'unit': 'cup', 'grams': 120.0},... []
28 Milk, dry, nonfat, instant, with added vitamin... Dairy and Egg Products 1092 [{'value': 35.1, 'units': 'g', 'description': ... [{'amount': 1, 'unit': 'cup', 'grams': 68.0}, ... []
29 Milk, dry, nonfat, calcium reduced Dairy and Egg Products 1093 [{'value': 35.5, 'units': 'g', 'description': ... [{'amount': 1, 'unit': 'oz', 'grams': 28.35}, ... []
... ... ... ... ... ... ... ...
6606 Beef, tenderloin, steak, separable lean only, ... Beef Products 23628 [{'value': 29.01, 'units': 'g', 'description':... [{'amount': 1, 'unit': 'oz', 'grams': 28.35}, ... [URMIS #2203]
6607 Beef, top sirloin, steak, separable lean only,... Beef Products 23629 [{'value': 29.51, 'units': 'g', 'description':... [{'amount': 1, 'unit': 'oz', 'grams': 28.35}, ... [URMIS #2237]
6608 Beef, short loin, top loin, steak, separable l... Beef Products 23630 [{'value': 29.16, 'units': 'g', 'description':... [{'amount': 1, 'unit': 'oz', 'grams': 28.35}, ... [URMIS # 2213]
6609 Beef, chuck, arm pot roast, separable lean onl... Beef Products 23631 [{'value': 22.26, 'units': 'g', 'description':... [{'amount': 1, 'unit': 'oz', 'grams': 28.35}, ... [URMIS #1049]
6610 Beef, brisket, flat half, separable lean only,... Beef Products 23632 [{'value': 21.45, 'units': 'g', 'description':... [{'amount': 1, 'unit': 'oz', 'grams': 28.35}, ... [URMIS #1623]
6611 Beef, chuck, arm pot roast, separable lean onl... Beef Products 23633 [{'value': 34.6, 'units': 'g', 'description': ... [{'amount': 1, 'unit': 'oz', 'grams': 28.35}, ... [URMIS #1049]
6612 Beef, brisket, flat half, separable lean only,... Beef Products 23634 [{'value': 33.18, 'units': 'g', 'description':... [{'amount': 1, 'unit': 'oz', 'grams': 28.35}, ... [URMIS #1623]
6613 Beef, round, eye of round, roast, separable le... Beef Products 23635 [{'value': 22.31, 'units': 'g', 'description':... [{'amount': 1, 'unit': 'oz', 'grams': 28.35}, ... [URMIS #1480]
6614 Beef, round, top round, steak, separable lean ... Beef Products 23636 [{'value': 23.13, 'units': 'g', 'description':... [{'amount': 1, 'unit': 'oz', 'grams': 28.35}, ... [URMIS #1553]
6615 Beef, round, bottom round, roast, separable le... Beef Products 23637 [{'value': 22.18, 'units': 'g', 'description':... [{'amount': 1, 'unit': 'oz', 'grams': 28.35}, ... [URMIS #1464]
6616 Beef, rib, small end (ribs 10-12), separable l... Beef Products 23638 [{'value': 29.58, 'units': 'g', 'description':... [{'amount': 1, 'unit': 'oz', 'grams': 28.35}, ... []
6617 CAMPBELL Soup Company, CAMPBELL'S Red and Whit... Soups, Sauces, and Gravies 27015 Campbell Soup Co. [{'value': 2.38, 'units': 'g', 'description': ... [{'amount': 1, 'unit': 'cup', 'grams': 126.0},... []
6618 CAMPBELL Soup Company, CAMPBELL's Red and Whit... Soups, Sauces, and Gravies 27016 Campbell Soup Co. [{'value': 3.17, 'units': 'g', 'description': ... [{'amount': 1, 'unit': 'cup', 'grams': 126.0},... []
6619 CAMPBELL Soup Company, CAMPBELL'S SELECT Soups... Soups, Sauces, and Gravies 27021 Campbell Soup Co. [{'value': 2.86, 'units': 'g', 'description': ... [{'amount': 1, 'unit': 'cup', 'grams': 245.0},... []
6620 CAMPBELL Soup Company, CAMPBELL'S SOUP AT HAND... Soups, Sauces, and Gravies 27022 Campbell Soup Co. [{'value': 1.31, 'units': 'g', 'description': ... [{'amount': 1, 'unit': 'serving', 'grams': 305... []
6621 CAMPBELL Soup Company, CAMPBELL'S SOUP AT HAND... Soups, Sauces, and Gravies 27023 Campbell Soup Co. [{'value': 0.98, 'units': 'g', 'description': ... [{'amount': 1, 'unit': 'serving', 'grams': 305... []
6622 CAMPBELL Soup Company, CAMPBELL'S SELECT Gold ... Soups, Sauces, and Gravies 27024 Campbell Soup Co. [{'value': 2.04, 'units': 'g', 'description': ... [{'amount': 1, 'unit': 'cup', 'grams': 245.0},... []
6623 CAMPBELL Soup Company, CAMPBELL'S SELECT Gold ... Soups, Sauces, and Gravies 27025 Campbell Soup Co. [{'value': 1.22, 'units': 'g', 'description': ... [{'amount': 1, 'unit': 'cup', 'grams': 245.0},... []
6624 CAMPBELL Soup Company, CAMPBELL'S SELECT Gold ... Soups, Sauces, and Gravies 27026 Campbell Soup Co. [{'value': 1.22, 'units': 'g', 'description': ... [{'amount': 1, 'unit': 'cup', 'grams': 245.0},... []
6625 CAMPBELL Soup Company, CAMPBELL'S Red and Whit... Soups, Sauces, and Gravies 27032 Campbell Soup Co. [{'value': 6.35, 'units': 'g', 'description': ... [{'amount': 1, 'unit': 'cup', 'grams': 126.0},... []
6626 CAMPBELL Soup Company, V8 Vegetable Juice, Ess... Vegetables and Vegetable Products 31010 Campbell Soup Co. [{'value': 0.8200000000000001, 'units': 'g', '... [{'amount': 1, 'unit': 'oz', 'grams': 243.0}, ... []
6627 CAMPBELL Soup Company, V8 Vegetable Juice, Spi... Vegetables and Vegetable Products 31013 Campbell Soup Co. [{'value': 0.8200000000000001, 'units': 'g', '... [{'amount': 1, 'unit': 'fl oz', 'grams': 243.0... []
6628 CAMPBELL Soup Company, PACE, Jalapenos Nacho S... Vegetables and Vegetable Products 31014 Campbell Soup Co. [{'value': 0.0, 'units': 'g', 'description': '... [{'amount': 1, 'unit': 'oz', 'grams': 30.0}, {... []
6629 CAMPBELL Soup Company, V8 60% Vegetable Juice,... Vegetables and Vegetable Products 31016 Campbell Soup Co. [{'value': 0.41000000000000003, 'units': 'g', ... [{'amount': 1, 'unit': 'fl oz', 'grams': 243.0... []
6630 CAMPBELL Soup Company, V8 Vegetable Juice, Low... Vegetables and Vegetable Products 31017 Campbell Soup Co. [{'value': 0.8200000000000001, 'units': 'g', '... [{'amount': 1, 'unit': 'fl oz', 'grams': 243.0... []
6631 Bologna, beef, low fat Sausages and Luncheon Meats 42161 [{'value': 11.8, 'units': 'g', 'description': ... [{'amount': 1, 'unit': 'slice', 'grams': 28.0}... []
6632 Turkey and pork sausage, fresh, bulk, patty or... Sausages and Luncheon Meats 42173 [{'value': 22.7, 'units': 'g', 'description': ... [{'amount': 1, 'unit': 'cup, cooked', 'grams':... []
6633 Babyfood, juice, pear Baby Foods 43408 None [{'value': 0.0, 'units': 'g', 'description': '... [{'amount': 1, 'unit': 'fl oz', 'grams': 31.2}... []
6634 Babyfood, dessert, banana yogurt, strained Baby Foods 43539 None [{'value': 1.1, 'units': 'g', 'description': '... [{'amount': 1, 'unit': 'tbsp', 'grams': 15.0},... []
6635 Babyfood, banana no tapioca, strained Baby Foods 43546 None [{'value': 1.0, 'units': 'g', 'description': '... [{'amount': 1, 'unit': 'tbsp', 'grams': 15.0},... []

6636 rows × 7 columns

In [ ]:
 
728x90

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading