티스토리 뷰

데이터 연산

 

pandas의 Series()와 DataFrame()으로 생성한 데이터끼리는 사칙 연산을 할 수 있다.

 

먼저 Series()로 생성한 Series 데이터의 예를 살펴보겠다.

 

In:

 

 

s1 = pd.Series([1, 2, 3, 4, 5])
s2 = pd.Series([10, 20, 30, 40, 50])
s1 + s2

Out:

 

 

 

 

 

 

0    11
1    22
2    33
3    44
4    55
dtype: int64

In:

s2 - s1

Out:

 

 

 

 

 

 

0     9
1    18
2    27
3    36
4    45
dtype: int64

In:

s2/s1

Out:

 

 

 

 

 

0    10.0
1    10.0
2    10.0
3    10.0
4    10.0
dtype: float64

파이썬의 리스트와 NumPy의 배열과 달리 pandas의 데이터끼리는 서로 크기가 달라도 연산할 수 있다. 이 경우 연산을 할 수 있는 항목만 연산을 수행한다. 다음 예제를 보자.

 

In:

 

 

s3 = pd.Series([1, 2, 3, 4])
s4 = pd.Series([10, 20, 30, 40 ,50])
s3 + s4

Out:

 

 

 

 

 

0    11.0
1    22.0
2    33.0
3    44.0
4     NaN
dtype: float64

In:

s4 - s3

Out:

 

 

 

 

 

0     9.0
1    18.0
2    27.0
3    36.0
4     NaN
dtype: float64

In:

s4 * s3

Out:

 

 

 

 

 

0     10.0
1     40.0
2     90.0
3    160.0
4      NaN
dtype: float64

In:

s4 / s3

Out:

 

 

 

 

 

0    10.0
1    10.0
2    10.0
3    10.0
4     NaN
dtype: float64

 

 

 

s3와 s4의 데이터 크기는 다르다. 이 경우 연산할 수 있는 부분만 연산해 결과를 보여주고 연산할 수 없는 부분은 NaN으로 표시한다.

 

DataFrame()으로 생성한 DataFrame 데이터끼리도 사칙 연산을 할 수 있다.

 

이를 확인하기 위해 다음 예제에서는 먼저 DataFrame 데이터 df1과 df2를 생성하겠다.

 

In:

 

 

 

 

table_data1 = {'A': [1, 2, 3, 4, 5],
               'B': [10, 20, 30, 40, 50],
               'C': [100, 200, 300, 400, 500]}
df1 = pd.DataFrame(table_data1)
df1

Out:

 

 

 

 

 

 

A B C
0 1 10 100
1 2 20 200
2 3 30 300
3 4 40 400
4 5 50 500

In:

 

 

 

 

table_data2 = {'A': [6, 7, 8],
               'B': [60, 70, 80],
               'C': [600, 700, 800]}
df2 = pd.DataFrame(table_data2)
df2

Out:

 

 

 

 

 

A B C
0 6 60 600
1 7 70 700
2 8 80 800

두 개의 DataFrame 데이터 df1과 df2는 길이가 같지 않다. 두 데이터의 길이가 같지 않더라도 앞의 Series 데이터처럼 연산할 수 있다.

 

In:

df1 + df2

Out:

 

 

 

 

 

 

 

A B C
0 7.0 70.0 700.0
1 9.0 90.0 900.0
2 11.0 110.0 1100.0
3 NaN NaN NaN
4 NaN NaN NaN

Series 데이터의 경우와 마찬가지로 DataFrame 데이터의 경우도 연산할 수 있는 항목끼리만 연산하고 그렇지 못한 항목은 NaN으로 표시한다.

 

또한 pandas에는 데이터의 통계 분석을 위한 다양한 메서드가 있어서 데이터의 총합, 평균, 표준 편차 등을 쉽게 구할 수 있다.

 

다음 예제를 통해 pandas의 메서드로 통계 분석하는 방법을 살펴보겠다.

 

In:

 

 

 

 

 

 

 

table_data3 = {'봄': [256.5, 264.3, 215.9, 223.2, 312.8],
               '여름': [770.6, 567.5, 599.8, 387.1, 446.2],
               '가을': [363.5, 231.2, 293.1, 247.7, 381.6],
               '겨울': [139.3, 59.9, 76.9, 109.1, 108.1]}
columns_list = ['봄', '여름', '가을', '겨울']
index_list = ['2012', '2013', '2014', '2015', '2016']

df3 = pd.DataFrame(table_data3, columns = columns_list, index = index_list)
df3

Out:

 

 

 

 

 

 

 

 

여름 가을 겨울
2012 256.5 770.6 363.5 139.3
2013 264.3 567.5 231.2 59.9
2014 215.9 599.8 293.1 76.9
2015 223.2 387.1 247.7 109.1
2016 312.8 446.2 381.6 108.1

이제 생성된 DataFrame 데이터(df3)를 이용해 통계를 구해보겠다. pandas에서 제공하는 통계 메서드는 원소의 합을 구하는 sum(), 평균을 구하는 mean(), 표준 편차를 구하는 std(), 분산을 구하는 var(), 최솟값을 구하는 min(), 최댓값을 구하는 max(), 각 원소의 누적 합을 구하는 cumsum(), 각 원소의 누적 곱을 구하는 cumprod() 등이 있다. 몇 가지 예만 살펴보자. 앞의 DataFrame 데이터(df3)에서 2012년에서 2016년에 걸쳐 계절별로 강수량의 평균(mean)과 표준 편차(std)를 구하면 다음과 같다.

 

In:

df3.mean()

Out:

 

 

 

 

봄     254.54
여름    554.24
가을    303.42
겨울     98.66
dtype: float64

In:

df3.std()

Out:

 

 

 

 

봄      38.628267
여름    148.888895
가을     67.358496
겨울     30.925523
dtype: float64

계절별로 평균과 표준 편차를 구하는 방법을 살펴봤습니다. 만약 연도별 평균 강수량과 표준 편차를 구하려면 어떻게 하면 될까요? mean()과 std()는 연산의 방향 설정하기 위해 axis 인자를 추가할 수 있다. 인자 axis가 0이면 DataFrame의 values에서 열별로 연산을 수행하고, 1이면 행별로 연산을 수행한다. axis 인자를 설정하지 않으면 기본값으로 0이 설정된다. 따라서 df3에서 연도별 강수량의 평균과 표준편차를 구하려면 다음과 같이 연산의 방향을 행 방향으로 설정한다.

 

In:

df3.mean(axis=1)

Out:

 

 

 

 

 

2012    382.475
2013    280.725
2014    296.425
2015    241.775
2016    312.175
dtype: float64

In:

df3.std(axis=1)

Out:

 

 

 

 

 

2012    274.472128
2013    211.128782
2014    221.150739
2015    114.166760
2016    146.548658
dtype: float64

앞에서는 평균과 표준 편차를 개별적으로 구했으나 다음과 같이 describe( )를 이용하면 평균, 표준 편차, 최솟값과 최댓값 등을 한 번에 구할 수 있다.

 

In:

df3.describe()

Out:

 

 

 

 

 

 

 

 

 

 

 

여름 가을 겨울
count 5.000000 5.000000 5.000000 5.000000
mean 254.540000 554.240000 303.420000 98.660000
std 38.628267 148.888895 67.358496 30.925523
min 215.900000 387.100000 231.200000 59.900000
25% 223.200000 446.200000 247.700000 76.900000
50% 256.500000 567.500000 293.100000 108.100000
75% 264.300000 599.800000 363.500000 109.100000
max 312.800000 770.600000 381.600000 139.300000

 

 

데이터를 원하는 대로 선택하기

 

다수의 데이터가 입력된 데이터 표에서 원하는 데이터만을 선택하는 기능은 데이터를 분석할 때 꼭 필요하다. 이번에는 pandas의 DataFrame 데이터를 원본 훼손 없이 원하는 부분만 선택하는 방법을 알아보겠다.

 

2011년부터 2017년가지 노선별 KTX 이용자 수(단위: 천 명) 데이터이다. Data Frame 데이터를 생성하자.

 

In:

 

 

 

 

 

 

 

 

 

 

 

 

import pandas as pd
import numpy as np

 

KTX_data = {'경부선 KTX': [39060, 39896, 42005, 43621, 41702, 41266, 32427],
            '호남선 KTX': [7313, 6967, 6873, 6626, 8675, 10622, 9228],
            '경전선 KTX': [3627, 4169, 4088, 4424, 4606, 4984, 5570],
            '전라선 KTX': [309, 1771, 1954, 2244, 3146, 3945, 5766],
            '동해선 KTX': [np.nan,np.nan, np.nan, np.nan, 2395, 3786, 6667]}
col_list = ['경부선 KTX', '호남선 KTX', '경전선 KTX', '전라선 KTX', '동해선 KTX']
index_list = ['2011', '2012', '2013', '2014', '2015', '2016', '2017']

 

df_KTX = pd.DataFrame(KTX_data, columns = col_list, index = index_list)
df_KTX

Out:

 

 

 

 

 

 

 

 

 

경부선 KTX 호남선 KTX 경전선 KTX 전라선 KTX 동해선 KTX
2011 39060 7313 3627 309 NaN
2012 39896 6967 4169 1771 NaN
2013 42005 6873 4088 1954 NaN
2014 43621 6626 4424 2244 NaN
2015 41702 8675 4606 3146 2395.0
2016 41266 10622 4984 3945 3786.0
2017 32427 9228 5570 5766 6667.0

위 코드에서 DataFrame 데이터를 변수 df_KTX에 할당했다. df_KTX 변수를 이용해 다양한 방법으로 데이터를 선택해 보겠다.

 

우선 DataFrame 데이터의 index, columns, values를 확인하려면 다음과 같이 작성하면 된다.

 

In:

df_KTX.index

Out:

Index(['2011', '2012', '2013', '2014', '2015', '2016', '2017'], dtype='object')

In:

df_KTX.columns

Out:

Index(['경부선 KTX', '호남선 KTX', '경전선 KTX', '전라선 KTX', '동해선 KTX'], dtype='object')

In:

df_KTX.values

Out:

 

 

 

 

 

 

array([[39060.,  7313.,  3627.,   309.,    nan],
       [39896.,  6967.,  4169.,  1771.,    nan],
       [42005.,  6873.,  4088.,  1954.,    nan],
       [43621.,  6626.,  4424.,  2244.,    nan],
       [41702.,  8675.,  4606.,  3146.,  2395.],
       [41266., 10622.,  4984.,  3945.,  3786.],
       [32427.,  9228.,  5570.,  5766.,  6667.]])

DataFrame 데이터를 분석할 때 크기가 큰 데이터는 데이터 전체를 출력하면 너무 많은 데이터가 출력 돼 분석할 때 오히려 불편하다. 이 경우 데이터 중 일부만 보면서 분석한 후 코드를 작성하면 편리하다. pandas에서는 다음과 같이 head()와 tail()을 이용해 DataFrame의 전체 데이터 중 처음 일부분과 끝 일부분만 반환할 수 있다.

 

DataFrame_data.head([n]) 
DataFrame_data.tail([n])

여기서 인자 n을 지정하면 head(n)의 경우에는 처음 n개의 행의 데이터를 반환하고 tail(n)의 경우에는 마지막 n개의 행 데이터를 반환한다. 인자 n을 지정하지 않으면 기본값으로 5가 지정된다.

 

다음 예제를 보자. 먼저 인자 n 없이 DataFrame_data.head()와 DataFrame_data.tail()을 수행하겠다.

 

In:

df_KTX.head()

Out:

 

 

 

 

 

 

 

 

경부선 KTX 호남선 KTX 경전선 KTX 전라선 KTX 동해선 KTX
2011 39060 7313 3627 309 NaN
2012 39896 6967 4169 1771 NaN
2013 42005 6873 4088 1954 NaN
2014 43621 6626 4424 2244 NaN
2015 41702 8675 4606 3146 2395.0

In:

df_KTX.tail()

Out:

 

 

 

 

 

 

 

 

경부선 KTX 호남선 KTX 경전선 KTX 전라선 KTX 동해선 KTX
2013 42005 6873 4088 1954 NaN
2014 43621 6626 4424 2244 NaN
2015 41702 8675 4606 3146 2395.0
2016 41266 10622 4984 3945 3786.0
2017 32427 9228 5570 5766 6667.0

보다시피 인자 없이 head()와 tail()을 실행하면 각각 DataFrame 데이터의 첫 5개 행 데이터와 마지막 5개의 행 데이터를 반환한 것을 볼 수 있다. n개의 처음과 마지막 행 데이터를 반환하려면 다음과 같이 인자 n을 지정해서 head(n)와 tail(n)을 실행한다.

 

In:

df_KTX.head(3)

Out:

 

 

 

 

 

경부선 KTX 호남선 KTX 경전선 KTX 전라선 KTX 동해선 KTX
2011 39060 7313 3627 309 NaN
2012 39896 6967 4169 1771 NaN
2013 42005 6873 4088 1954 NaN

In:

df_KTX.tail(2)

Out:

 

 

 

 

경부선 KTX 호남선 KTX 경전선 KTX 전라선 KTX 동해선 KTX
2016 41266 10622 4984 3945 3786.0
2017 32427 9228 5570 5766 6667.0

결과를 보면 지정된 수 만큼의 행 데이터만 출력된 것을 볼 수 있다.

 

DataFrame 데이터에서 연속된 구간의 행 데이터를 선택하려면 다음과 같이 '행 시작 위치'와 '끝 위치'를 지정한다.

 

 DataFrame_data[행_시작_위치:행_끝_위치]

위와 같이 지정하면 DataFrame 데이터(DataFrame_data) 중에서 '행_시작_위치 ~ 행_끝_위치-1'까지의 행 데이터를 반환한다. 행의 위치는 0부터 시작한다.

 

다음으로 DataFrame 데이터 df_KTX를 이용해 원하는 행을 선택하는 방법을 알아보겠다. 만약 변수 da_KTX에서 행 위치 1의 행 데이터 하나를 선택하려면 다음과 같이 작성한다.

 

In:

df_KTX[1:2]

Out:

 

 

 

 

경부선 KTX 호남선 KTX 경전선 KTX 전라선 KTX 동해선 KTX
2012 39896 6967 4169 1771 NaN

변수 df_KTX에서 행 위치 2에서 4까지의 행 데이터를 선택하려면 다음과 같이 작성한다.

 

In:

df_KTX[2:5]

Out:

 

 

 

 

 

경부선 KTX 호남선 KTX 경전선 KTX 전라선 KTX 동해선 KTX
2013 42005 6873 4088 1954 NaN
2014 43621 6626 4424 2244 NaN
2015 41702 8675 4606 3146 2395.0

데이터에서 하나의 열만 선택하려면 다음과같이 하나의 columns 항목 이름을 지정한다.

 

DataFrame_data[column_name] 

 

위와 같이 작성하면 DataFrame_data에서 column_name으로 지정한 열이 선택된다.

 

다음 df_KTX에서 columns의 항목 중 '경부선 KTX'를 지정해 하나의 열 데이터만 선택한 예이다.

 

In:

df_KTX['경부선 KTX']

Out:

 

 

 

 

 

 

 

2011    39060
2012    39896
2013    42005
2014    43621
2015    41702
2016    41266
2017    32427
Name: 경부선 KTX, dtype: int64

다음과 같이 DataFrame 데이터에서 하나의 열을 선택한 후 index의 범위를 지정해 원하는 데이터만 선택할 수도 있다.

 

DataFrame_data[column_name][start_index_name:end_index_name] 

DataFrame_data[column_name][start_index_pos:end_index_name] 

여기서 column_name으로 하나의 열을 선택한 후 'start_index_name:end_index_name'으로 index의 이름을 지정해 index의 범위를 선택할 수도 있고, 'start_index_pos:end_index_pos'로 index의 위치를 지정해 index의 범위를 선택할 수도 있다. index의 위치는 0부터 시작한다.

 

다음은 df_KTX에서 '경부선 KTX'로 열을 선택한 후 2012년에서 2014년까지 index의 범위를 index의 이름으로 지정한 예이다.

 

In:

df_KTX['경부선 KTX']['2012':'2014']

Out:

 

 

 

2012    39896
2013    42005
2014    43621
Name: 경부선 KTX, dtype: int64

다음은 index의 위치로 범위를 지정한 예이다.

 

In:

df_KTX['경부선 KTX'][2:5]

Out:

 

 

 

2013    42005
2014    43621
2015    41702
Name: 경부선 KTX, dtype: int64

 

어떤 방법으로 index의 범위를 지정해도 원하는 범위의 데이터를 선택할 수 있다.

 

DataFrame 데이터 중 하나의 원소만 선택하려면 다음 방법 중 하나를 이용하면 된다.

 

DataFrame_data.loc[index_name][column_name] 

DataFrame_data.loc[index_name, column_name] 

DataFrame_data[column_name][index_name] 

DataFrame_data[column_name][index_pos]

DataFrame_data[column_name].loc[index_name] 

예를 들어 변수 df_KTX에서 2016년의 '호남선 KTX'의 이용자 수를 선택하려면 다음과 같이 여러 방법으로 수행할 수 있다.

 

In:

df_KTX.loc['2016']['호남선 KTX']

Out:

10622.0

In:

df_KTX.loc['2016','호남선 KTX']

Out:

10622

In:

df_KTX['호남선 KTX']['2016']

Out:

10622

In:

df_KTX['호남선 KTX'][5]

Out:

10622

In:

df_KTX['호남선 KTX'].loc['2016']

Out:

10622

지금까지 원하는 데이터를 추출하는 방법을 살펴봤다. 이어서 DataFrame 데이터의 행과 열을 바꾸는 방법을 살펴보겠다. 행렬에서 행과 열을 바꾸는 것을 전치라고 한다. pandas에서는 다음과 같은 방법으로 DataFrame 데이터의 전치를 구할 수 있다.

 

DataFrame_data.T 

다음은 df_KTK의 전치를 구하는 예이다. 결과를 보면 df_KTK의 행과 열이 바뀐 것을 볼 수 있다.

 

In:

df_KTX.T

Out:

 

 

 

 

 

 

 

2011 2012 2013 2014 2015 2016 2017
경부선 KTX 39060.0 39896.0 42005.0 43621.0 41702.0 41266.0 32427.0
호남선 KTX 7313.0 6967.0 6873.0 6626.0 8675.0 10622.0 9228.0
경전선 KTX 3627.0 4169.0 4088.0 4424.0 4606.0 4984.0 5570.0
전라선 KTX 309.0 1771.0 1954.0 2244.0 3146.0 3945.0 5766.0
동해선 KTX NaN NaN NaN NaN 2395.0 3786.0 6667.0

DataFrame 데이터는 열의 항목 이름을 지정해 열의 순서를 지정할 수 있다. 먼저 앞에서 생성한 df_KTX를 다시 한번 출력해보겠다.

 

In:

df_KTX

Out:

 

 

 

 

 

 

 

 

 

 

경부선 KTX 호남선 KTX 경전선 KTX 전라선 KTX 동해선 KTX
2011 39060 7313 3627 309 NaN
2012 39896 6967 4169 1771 NaN
2013 42005 6873 4088 1954 NaN
2014 43621 6626 4424 2244 NaN
2015 41702 8675 4606 3146 2395.0
2016 41266 10622 4984 3945 3786.0
2017 32427 9228 5570 5766 6667.0

DataFrame 데이터 변수 df_KTX에 열의 항목을 지정해 열의 순서를 다음과 같이 변경하겠다.

 

In:

df_KTX[['동해선 KTX', '전라선 KTX', '경전선 KTX', '호남선 KTX', '경부선 KTX']]

Out:

 

 

 

 

 

 

 

 

 

 

동해선 KTX 전라선 KTX 경전선 KTX 호남선 KTX 경부선 KTX
2011 NaN 309 3627 7313 39060
2012 NaN 1771 4169 6967 39896
2013 NaN 1954 4088 6873 42005
2014 NaN 2244 4424 6626 43621
2015 2395.0 3146 4606 8675 41702
2016 3786.0 3945 4984 10622 41266
2017 6667.0 5766 5570 9228 32427

 

 

데이터 통합하기

 

이번에는 두 개의 데이터를 하나로 통합하는 방법을 살펴보겠다. 통합 방법에는 세로로 증가하는 방향으로 통합하기, 가로로 증가하는 방향으로 통합하기, 특정 열을 기준으로 통합하는 방법이 있다.

 

 

①세로방향으로 통합하기

 

DataFrame에서 columns가 같은 두 데이터를 세로 방향(index 증가 방향)으로 합하려면 다음과 같이 'append()'를 이용한다.

 

 DataFrame_data1.append(DataFrame_data2 [,ignore_index=True])

위와 같이 실행하면 세로 방향으로 DataFrame_data1 다음에 DataFrame_data2가 추가돼서 DataFrame 데이터로 반환된다. 여기서 'ignore_index=True'를 입력하면 생성된 DataFrame 데이터에는 데이터 순서대로 새로운 index가 할당된다.

 

이를 확인하기 위해 다음과 같이 두 개의 DataFrame 데이터를 생성하겠다. 먼저 두 학급의 시험 점수가 담긴 DataFrame 데이터(df1)를 다음과 같이 생성하겠다.

 

In:

 

 

 

 

import pandas as pd
import numpy as np

df1 = pd.DataFrame({'Class1': [95, 92, 98, 100],
                    'Class2': [91, 93, 97, 99]})
df1

Out:

 

 

 

 

 

 

Class1 Class2
0 95 91
1 92 93
2 98 97
3 100 99

각 반에서 각각 두 명의 학생이 전학을 와서 다음과 같이 DataFrame 데이터 (df2)를 추가로 생성했다.

 

In:

 

 

df2 = pd. DataFrame({'Class1': [87, 89],
                     'Class2': [85, 90]})
df2

Out:

 

 

 

Class1 Class2
0 87 85
1 89 90

이제 'append()'이용해 df1에 df2를 추가해서 데이터를 하나로 만들어 보겠다.

 

In:

df1.append(df2)

Out:

 

 

 

 

 

 

 

 

 

Class1 Class2
0 95 91
1 92 93
2 98 97
3 100 99
0 87 85
1 89 90

보다시피 기존 데이터 df1에 세로 방향으로 df2가 추가됐는데 생성된 데이터의 index가 기존의 index와 같은 것을 볼 수 있다. 생성된 데이터에서 순차적으로 index가 증가하게 하려면 옵션으로 'ignore_index=True'를 입력하면 된다.

 

다음 예제를 보자.

 

In:

df1.append(df2, ignore_index=True)

Out:

 

 

 

 

 

 

 

 

 

Class1 Class2
0 95 91
1 92 93
2 98 97
3 100 99
4 87 85
5 89 90

결과에서 두 개의 DataFrame 데이터가 합쳐졌지만 index가 순차적으로 증가해 하나의 데이터처럼 만들어졌다.

 

만약 columns가 같지 않은 DataFrame 데이터를 'append()'를 이용하여 추가한다면 데이터가 없는 부분은 NaN으로 채워진다. 이를 확인하기 위해 다음과 같이 열이 하나만 있는 DataFrame 데이터(df3)를 생성하겠다.

 

In:

 

df3 = pd.DataFrame({'Class1':[96,83]})
df3

Out:

 

 

 

Class1
0 96
1 83

이제 열이 두 개인 DataFrame 데이터(df2)에 열이 하나인 DataFrame 데이터(df3)를 추가하겠다.

 

In:

df2.append(df3, ignore_index=True)

Out:

 

 

 

 

 

 

Class1 Class2
0 87 85.0
1 89 90.0
2 96 NaN
3 83 NaN

결과에서 볼 수 있듯이 데이터가 없는 부분은 NaN으로 채워졌다.

 

 

②가로 방향 통합하기

 

앞에서는 columns가 같은 두 DataFrame 데이터에 대해 세로 방향(index 증가 방향)으로 데이터를 추가하는 방법을 살펴봤다. 이제 indes가 같은 두 DataFrame 데이터에 대해 가로 방향(columns 증가 방향)에 새로운 데이터를 추가하는 방법을 알아보겠다. 두 개의 DataFrame 데이터를 가로 방향으로 합치려면 다음과 같이 'join()'을 이용한다.

 

DataFrame_data1.join(DataFrame_data2_ 

위와 같이 작성하면 DataFrame_data1 다음에 가로 방향으로 DataFrame_data2가 추가돼서 DataFrame 데이터로 반환된다.

 

다음으로 'join()'을 이용한 예를 살펴보겠다. 우선 다음과 같이 df1과 index 방향으로 크기가 같은 DataFrame 데이터 하나를 생성한다.

 

In:

 

df4 = pd.DataFrame({'Class3': [93, 91, 95, 98]})

df4

Out:

 

 

 

 

 

 

Class3
0 93
1 91
2 95
3 98

이제 join()을 이용해 df1에 df4를 가로 방향으로 추가하겠다.

 

In:

df1.join(df4)

Out:

 

 

 

 

 

 

Class1 Class2 Class3
0 95 91 93
1 92 93 91
2 98 97 95
3 100 99 98

다음과 같이 index 라벨을 지정한 DataFrame의 데이터의 경우에도 index가 같으면 'join()'을 이용해 가로 방향으로 데이터를 추가할 수 있다.

 

In:

 

 

 

 

 

index_label = ['a', 'b', 'c', 'd']
df1a = pd.DataFrame({'Class1': [95, 92, 98, 100],
                     'Class2': [91, 93, 97, 99]}, index=index_label)
df4a = pd.DataFrame({'Class3': [93, 91, 95, 98]}, index=index_label)

 

df1a.join(df4a)

Out:

 

 

 

 

 

Class1 Class2 Class3
a 95 91 93
b 92 93 91
c 98 97 95
d 100 99 98

만약 index의 크기가 다른 DataFrame 데이터를 'join()'을 이용해 추가한다면 데이터가 없는 부분은 NaN으로 채워진다. 다음 예제를 보자

 

In:

 

df5 = pd.DataFrame({'Class4': [82, 92]})

df5

Out:

 

 

 

 

Class4
0 82
1 92

위와 같이 index의 크기가 2인 DataFrame 데이터(df5)를 'join( )'을 이용해 index 크기가 4인 DataFrame 데이터(df1)에 추가하겠다.

 

In:

df1.join(df5)

Out:

 

 

 

 

 

 

Class1 Class2 Class4
0 95 91 82.0
1 92 93 92.0
2 98 97 NaN
3 100 99 NaN

위의 결과처럼 index의 크기가 작은 DataFrame 데이터에서 원소가 없는 부분은 NaN으로 채워진다.

 

 

③특정 열을 기준으로 통합하기

 

다음으로 두 개의 DataFrame 데이터를 특정 열을 기준으로 통합해 보겠다. 특정 열을 키라고 한다. 만약 두 개의 DataFrame 데이터에 공통된 열이 있다면 이 열을 기준으로 두 데이터를 다음과 같은 방법으로 통합할 수 있다.

 

DataFrame_left_data.merge(DataFrame_right_data)

 

이를 수행하면 왼쪽 데이터(DataFrame_left_data)와 오른쪽 데이터(DataFrame_right_data)가 공통된 열을 중심으로 좌우로 통합된다.

 

이를 확인하기 위해 우선 두 개의 DataFrame 데이터를 생성해 보겠다. 먼저 1월부터 4월까지 제품A와 제품B의 판매량 데이터를 변수 df_A_B에 할당하고 같은 기간 동안 제품C와 제품D의 판매량 데이터를 변수 df_C_D에 다음과 같이 할당하겠다.

 

In:

 

 

 

df_A_B = pd.DataFrame({'제품A': [100, 150, 200, 130],
                       '제품B': [90, 110, 140, 170],
                       '판매월': ['1월', '2월', '3월', '4월']})
df_A_B

Out:

 

 

 

 

 

 

제품A 제품B 판매월
0 100 90 1월
1 150 110 2월
2 200 140 3월
3 130 170 4월

In:

 

 

 

df_C_D = pd.DataFrame({'판매월': ['1월', '2월', '3월', '4월'],
                       '제품C': [112, 141, 203, 134],
                       '제품D': [90, 110, 140, 170]})
df_C_D

Out:

 

 

 

 

 

 

판매월 제품C 제품D
0 1월 112 90
1 2월 141 110
2 3월 203 140
3 4월 134 170

DataFrame 데이터 df_A_B와 df_C_D에 모두 있는 것이 '판매월'인 열 데이터이므로 이를 중심으로 두 DataFrame 데이터를 통합하려면 다음과 같이 작성하면 된다.

 

In:

df_A_B.merge(df_C_D)

Out:

 

 

 

 

 

 

제품A 제품B 판매월 제품C 제품D
0 100 90 1월 112 90
1 150 110 2월 141 110
2 200 140 3월 203 140
3 130 170 4월 134 170

위 결과는 두 데이터가 '판매월'을 기준으로 통합된 결과이다. 특정 열을 기준으로 두 DataFrame 데이터가 모두 값을 갖고 있을 때 특정 열을 기준으로 통합하는 방법을 살폈다.

 

두 개의 DataFrame 데이터가 특정 열을 기준으로 일부만 공통된 값을 갖는 경우에 통합하려면 다음과 같이 'merge()'에 선택 인자를 지정하면 왼다.

 

DataFrame_left_data.merge(DataFrame_right_data, how=merge_method, on=key_label) 

여기서 on 인자에는 통합하려는 기준이 되는 특정 열의 라벨 이름을 입력한다. on 인자를 입력하지 않으면 자동으로 두 데이터에서 공통적으로 포함된 열이 선택된다. how 인자에는 지정된 특정 열을 기준으로 통합 방법을 지정한다. 표 11-7은 how 선택 인자에 따라 달라지는 통합 방법을 설명한다.

 

이제 특정 열을 기준으로 일부만 공통 데이터를 가진 두 DataFrame 데이터를 통합한 예를 살펴보겠다. 이를 위해 다음과 같이 두 개의 DataFrame 데이터를 생성하겠다.

 

In:

 

df_left = pd.DataFrame({'key':['A', 'B', 'C'], 'left': [1, 2, 3]})
df_left

Out:

 

 

 

 

 

key left
0 A 1
1 B 2
2 C 3

In:

 

df_right = pd.DataFrame({'key':['A', 'B', 'd'], 'right': [4, 5, 6]})
df_right

Out:

 

 

 

 

key right
0 A 4
1 B 5
2 d 6

두 개의 데이터(df_left와 df_right)에서 특정 열의 일부('A'와 'B') 데이터는 공통으로 있고 나머지('C'와 'D')는 각각 한쪽에만 있다. 두 데이터를 이용해 다음과 같이 how의 인자를 변경하면 통합 결과가 어떻게 달라지는지 살펴보겠다.

 

In:

df_left.merge(df_right, how='left', on='key')

Out:

 

 

 

 

 

key left right
0 A 1 4.0
1 B 2 5.0
2 C 3 NaN

In:

df_left.merge(df_right, how='right', on='key')

Out:

 

 

 

 

 

key left right
0 A 1.0 4
1 B 2.0 5
2 d NaN 6

In:

df_left.merge(df_right, how='outer', on='key')

Out:

 

 

 

 

 

 

key left right
0 A 1.0 4.0
1 B 2.0 5.0
2 C 3.0 NaN
3 d NaN 6.0

In:

df_left.merge(df_right, how='inner', on='key')

Out:

 

 

 

 

key left right
0 A 1 4
1 B 2 5

예제에서 on 인자의 값은 key로 지정하고 how 인자의 값을 각각 left, right, outer, inner로 변경했다. 각각 출력된 결과를 보면 how 인자의 값에 따라 통합 결과가 달라지는 것을 볼 수 있다. 여기서 해당 항목에 데이터가 없는 경우는 NaN이 자동으로 입력됐다.

 

 

 

데이터 파일을 읽고 쓰기

 

앞에서 파이썬에 기본적으로 제공하는 방법으로 파일을 읽고 쓰는 방법을 알아봤다. pandas는 표 형식의 데이터 파일을 DataFrame 형식의 데이터로 읽어오는 방법과 DataFrame 형식의 데이터를 표 형식으로 파일로 저장하는 편리한 방법을 제공한다.

 

 

①표 형식의 데이터 파일을 읽기

 

pandas에서는 표 형식의 데이터 파일을 읽어 오는 몇 가지 방법을 제공한다. 그 중 대표적인 read_csv()를 이용해 표 형식의 텍스트 데이터 파일을 읽는 방법을 살펴보겠다. read_csv()는 기본적으로 각 데이테 필드가 콤마(,)로 구분된 CSV(comma-separated vlues) 파일을 읽는데 이용한다. 또한 옵션을 지정하면 각 데이터 필드가 콤마 외의 구분자로 돼 있어도 데이터를 읽어올 수 있다.

 

다음은 read_csv()를 이용하는 방법이다.

 

 DataFrame_data = pd.read_csv(file_name [, options])

 

file_name은 텍스트 파일의 이름으로 경로를 포함할 수도 있다. options는 선택 사항인데 이것에 대해서는 예제를 통해 자세히 살펴보겠다.

 

 

앞에서 작업 폴더인 'C:\myPyCode' 아래에 data 폴더를 만들었습니다. data 폴더 아래에 다음과 같이 csv 데이터 파일('sea_rain1.csv')을 생성한다.

 

In:

 

 

 

 

 

 

%%writefile C:\myPyCode\data\sea_rain1.csv
    연도, 동해, 남해, 서해, 전체
    1996,17.4629,17.2288,14.436,15.9067
    1997,17.4116,17.4092,14.8248,16.1526
    1998,17.5944,18.011,15.2512,16.6044
    1999,18.1495,18.3175,14.8979,16.6284
    2000,17.9288,18.1766,15.0504,16.6178

Out:

Writing C:\myPyCode\data\sea_rain1.csv

이제 pandas의 read_csv( )로 위의 CSV파일을 읽어보겠다.

 

In:

import pandas as pd
pd.read_csv('C:/myPyCode/data/sea_rain1.csv')

Out:

 

 

 

 

 

 

 

연도 동해 남해 서해 전체
0 1996 17.4629 17.2288 14.4360 15.9067
1 1997 17.4116 17.4092 14.8248 16.1526
2 1998 17.5944 18.0110 15.2512 16.6044
3 1999 18.1495 18.3175 14.8979 16.6284
4 2000 17.9288 18.1766 15.0504 16.6178

윈도우 메모장에 저장한 csv파일 'sea_rain1_from_notepad.csv'를 read_csv()로 읽어오겠다. 이 경우 endcoding = "cp949" 옵션을 추가해야 한글을 제대로 읽어올 수 있다.

 

In:

pd.read_csv('C:/myPyCode/data/sea_rain1_from_notepad.csv',encoding = "cp949")

Out:

오류남. 이유를 모르겠음.

만약 텍스트 파일에서 각 데이터 필드가 콤마가 아니라 다음 데이터 파일처럼 공백(빈캄)으로 구분돼 있으면 어덯게 해야 할까?

 

In:

 

 

 

 

 

 

%%writefile C:\myPyCode\data\sea_rain1.csv
연도, 동해, 남해, 서해, 전체
1996 17.4629 17.2288 14.436 15.9067
1997 17.4116 17.4092 14.8248 16.1526
1998 17.5944 18.011 15.2512 16.6044
1999 18.1495 18.3175 14.8979 16.6284
2000 17.9288 18.1766 15.0504 16.6178

Out:

Overwriting C:\myPyCode\data\sea_rain1.csv

read_csv()에서 읽고자 하는 데이터 파일의 구분자가 콤마가 아닌 경우에는 'sep=구분자' 옵션을 추가해야 텍스트 파일에서 pandas의 DataFrame 형식으로 데이터를 제대로 읽어올 수 있다. 만약 텍스트 데이터를 DataFrame 데이터로 읽어올 수 있다.

 

pandas에서 제공하는 read_csv()로 텍스트 파일을 읽어오면 index가 자동으로 지정된다. 이때 자동으로 생성된 index 말고 데이터 파일에서 특정 열을 index로 선택하려면 옵션에 'index_col=열 이름'을 추가하면 된다.

 

다음은 앞의 csv 데이터 파일 'sea_rain1.csv'에서 '연도' 열을 index로 선택해 DataFrame 형식으로 데이터를 불러온 예이다.

 

In:

pd.read_csv('C:/myPyCode/data/sea_rain1.csv', index_col="연도")

Out:

오류남

 

 

 

 

 

출처

'beginner > 파이썬 분석' 카테고리의 다른 글

서울시 구별 CCTV 현황 분석  (0) 2019.01.18
데이터 시각화  (0) 2019.01.17
데이터 분석을 위한 패키지-pandas ①  (0) 2019.01.16
모듈  (0) 2019.01.15
문자열과 텍스트 파일 데이터 다루기 ②  (0) 2019.01.15
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함