본문 바로가기

Python/Pandas

Pandas_04

반응형
day3_pandas2-Copy1
In [2]:
import numpy as np
import pandas as pd

행또는 열 별로 합 구하기

  • df.sum(axis=0)
  • df.sum(axis=1)
  • df[컬럼명].sum(axis=0)
  • df.loc[인덱스명].sum()
  • skipna = False

결측치가 있는 데이타프레임 생성하기

In [3]:
data = [[1.4, np.nan],
         [7.1, -4.5],
         [np.nan, np.nan],
         [0.75, -1.3]]
In [4]:
df = pd.DataFrame(data, columns=["one","two"], index=["a", "b", "c", "d"])
df
Out[4]:
one two
a 1.40 NaN
b 7.10 -4.5
c NaN NaN
d 0.75 -1.3

df.sum() => 세로합 => 시리즈

df.sum(axis=0) => 세로합 => 시리즈

In [6]:
df.sum()
Out[6]:
one    9.25
two   -5.80
dtype: float64
In [7]:
df.sum(axis=0)
Out[7]:
one    9.25
two   -5.80
dtype: float64

df.sum(axis=1) => 가로합 => 시리즈

In [41]:
df.sum(axis=1)
Out[41]:
a    1.40
b    2.60
c    0.00
d   -0.55
dtype: float64
In [7]:
df.sum(axis=0)
Out[7]:
one    9.25
two   -5.80
dtype: float64

df[컬럼명].sum()

df[컬럼명].sum(axis=0)

In [11]:
# 특정 열 방향 합
df["one"].sum()
Out[11]:
9.25
In [12]:
# 특정 열 방향 합
df["two"].sum()
Out[12]:
-5.8
In [ ]:
df
In [14]:
df.sum(axis=1)
Out[14]:
a    1.40
b    2.60
c    0.00
d   -0.55
dtype: float64

df.loc[인덱스명].sum()

In [16]:
# 특정 행 방향 합
df.loc["b"].sum()
Out[16]:
2.5999999999999996
In [15]:
df.loc["d"].sum()
Out[15]:
-0.55

열 방향으로 함수 적용시 NaN 은 건너뛰기

  • 데이타프레임.sum(axis=0/1, skipna=False)
In [17]:
df
Out[17]:
one two
a 1.40 NaN
b 7.10 -4.5
c NaN NaN
d 0.75 -1.3
In [18]:
df.sum(axis=1)
Out[18]:
a    1.40
b    2.60
c    0.00
d   -0.55
dtype: float64
In [52]:
#열 방향으로 함수 적용시 NaN 은 건너뛰기
df.sum(axis=1, skipna=False)
Out[52]:
a     NaN
b    2.60
c     NaN
d   -0.55
dtype: float64
In [19]:
df.sum(axis=0, skipna=False)
Out[19]:
one   NaN
two   NaN
dtype: float64

mean(), min(), max() 이용하기

  • 데이타프레임.mean(axis=0/1)
  • 데이타프레임.min(axis=0/1)
  • 데이타프레임.max(axis=0/1)
In [20]:
# 행 값 입력하기
data = [[1.4, np.nan],
         [7.1, -4.5],
         [np.nan, np.nan],
         [0.75, -1.3]]
In [21]:
# 컬럼명과 행 인덱스 명 지정
df = pd.DataFrame(data, columns=["one","two"], index=["a", "b", "c", "d"])
df
Out[21]:
one two
a 1.40 NaN
b 7.10 -4.5
c NaN NaN
d 0.75 -1.3
In [25]:
# 세로방향 평균 구하기 
df.mean()
Out[25]:
one    3.083333
two   -2.900000
dtype: float64
In [24]:
# 세로방향 평균 구하기 
df.mean(axis=0)
Out[24]:
one    3.083333
two   -2.900000
dtype: float64
In [26]:
# 가로방향의 평균 구하기 
df.mean(axis=1)
Out[26]:
a    1.400
b    1.300
c      NaN
d   -0.275
dtype: float64
In [58]:
# 열의 최소값 구하기 
df.min(axis=0)
Out[58]:
one    0.75
two   -4.50
dtype: float64
In [27]:
# 행의 최소값 구하기 
df.min(axis=1)
Out[27]:
a    1.4
b   -4.5
c    NaN
d   -1.3
dtype: float64

NaN 값을 최소값이나 평균값으로 대체하기

  • 데이타프레임이름.fillna(value=최소값또는 평균값)
In [60]:
data = [[1.4, np.nan],
         [7.1, -4.5],
         [np.nan, np.nan],
         [0.75, -1.3]]
In [28]:
# 컬럼명과 행 인덱스 명 지정
df = pd.DataFrame(data, columns=["one","two"], index=["a", "b", "c", "d"])
df
Out[28]:
one two
a 1.40 NaN
b 7.10 -4.5
c NaN NaN
d 0.75 -1.3
In [31]:
# 열의 평균값으로 NaN 값 채우기 , inplace=True 원본에 적용 
df.fillna(value=df.mean(axis=0) )
Out[31]:
one two
a 1.400000 -2.9
b 7.100000 -4.5
c 3.083333 -2.9
d 0.750000 -1.3
In [35]:
# 열의 최소값으로 NaN 값 채우기 
df.fillna(value=df.min(axis=0), inplace=True)
In [36]:
df
Out[36]:
one two
a 1.40 -4.5
b 7.10 -4.5
c 0.75 -4.5
d 0.75 -1.3

데이타프레임 간의 사칙 연산

데이타프레임1 연산자(+, -, *, /) 데이타프레임2
데이타프레임1.add(데이타프레임2, fill_value=NaN일때대체값)
데이타프레임1.subtract(데이타프레임2, fill_value=NaN일때대체값)
데이타프레임1.multifly(데이타프레임2, fill_value=NaN일때대체값)
데이타프레임1.div(데이타프레임2, fill_value=NaN일때대체값)
In [40]:
df1 = pd.DataFrame(
    np.arange(31,40).reshape(3,3), 
    columns=list("abc")) # ['a', 'b', 'c']
In [41]:
df2 = pd.DataFrame(
    np.arange(1,17).reshape(4,4), 
    columns=list("abcd"))
In [42]:
df1 + df2
Out[42]:
a b c d
0 32.0 34.0 36.0 NaN
1 39.0 41.0 43.0 NaN
2 46.0 48.0 50.0 NaN
3 NaN NaN NaN NaN
In [43]:
df1 - df2
Out[43]:
a b c d
0 30.0 30.0 30.0 NaN
1 29.0 29.0 29.0 NaN
2 28.0 28.0 28.0 NaN
3 NaN NaN NaN NaN
In [44]:
df1 * df2
Out[44]:
a b c d
0 31.0 64.0 99.0 NaN
1 170.0 210.0 252.0 NaN
2 333.0 380.0 429.0 NaN
3 NaN NaN NaN NaN
In [45]:
df1 / df2
Out[45]:
a b c d
0 31.000000 16.000000 11.000000 NaN
1 6.800000 5.833333 5.142857 NaN
2 4.111111 3.800000 3.545455 NaN
3 NaN NaN NaN NaN
In [100]:
df1
Out[100]:
a b c
0 31 32 33
1 34 35 36
2 37 38 39
In [101]:
df2
Out[101]:
a b c d
0 1 2 3 4
1 5 6 7 8
2 9 10 11 12
3 13 14 15 16

NaN 값을 특정값으로 교체한 후 사칙연산하기

In [46]:
df1.add(df2, fill_value=0)
Out[46]:
a b c d
0 32.0 34.0 36.0 4.0
1 39.0 41.0 43.0 8.0
2 46.0 48.0 50.0 12.0
3 13.0 14.0 15.0 16.0
In [47]:
df1.subtract(df2, fill_value=0)
Out[47]:
a b c d
0 30.0 30.0 30.0 -4.0
1 29.0 29.0 29.0 -8.0
2 28.0 28.0 28.0 -12.0
3 -13.0 -14.0 -15.0 -16.0
In [48]:
df1.multiply(df2,fill_value=1)
Out[48]:
a b c d
0 31.0 64.0 99.0 4.0
1 170.0 210.0 252.0 8.0
2 333.0 380.0 429.0 12.0
3 13.0 14.0 15.0 16.0
In [49]:
df1.div(df2, fill_value=1)
Out[49]:
a b c d
0 31.000000 16.000000 11.000000 0.250000
1 6.800000 5.833333 5.142857 0.125000
2 4.111111 3.800000 3.545455 0.083333
3 0.076923 0.071429 0.066667 0.062500

판다스에서 소숫점처리하기

기본값은 6자리 

pd.options.display.float_format = '{:.소숫점자리수f}'.format

예) 소숫점 2번째자리까지 표시 
pd.options.display.float_format = '{:.2f}'.format
In [51]:
pd.options.display.float_format = '{:.2f}'.format
In [52]:
df1.div(df2, fill_value=1)
Out[52]:
a b c d
0 31.00 16.00 11.00 0.25
1 6.80 5.83 5.14 0.12
2 4.11 3.80 3.55 0.08
3 0.08 0.07 0.07 0.06

데이타프레임의 병합

  • 두 데이터 프레임의 공통 컬럼이나 인덱스를 기준으로 두 개의 데이타프레임을 합친다.
  • 이 때 기준이 되는 컬럼과 인덱스를 키(key)라고 한다.
  • SQL의 조인(Join) 방식과 흡사
pd.merge(데이타프레임1, 데이타프레임2) : Inner Join
pd.merge(데이타프레임1, 데이타프레임2, how='outer/left/right')

특정 컬럼이 키가 되는 두개의 데이타프레임 생성

- 조건 
  : 컬럼명이 같아야한다. 
  : 중복되는 데이타값이 있어야 한다.
In [73]:
df1 = pd.DataFrame({
    '고객번호': [1001, 1002, 1003, 1004, 1005, 1006, 1007],
    '이름': ['둘리', '도우너', '또치', '길동', '희동', '마이콜', '영희']
}, columns=['고객번호', '이름'])
df1
Out[73]:
고객번호 이름
0 1001 둘리
1 1002 도우너
2 1003 또치
3 1004 길동
4 1005 희동
5 1006 마이콜
6 1007 영희
In [74]:
df2 = pd.DataFrame({
    '고객번호': [1001, 1001, 1005, 1006, 1008, 1001],
    '금액': [10000, 20000, 15000, 5000, 100000, 30000]
}, columns=['고객번호', '금액'])
df2
Out[74]:
고객번호 금액
0 1001 10000
1 1001 20000
2 1005 15000
3 1006 5000
4 1008 100000
5 1001 30000

inner join 방식으로 병합하기

  • 공통 컬럼인 고객번호를 기준으로 데이터를 찾아서 합친다.

  • 양쪽 데이터프레임에 모두 키가 존재하는 데이터만 보여준다

pd.merge(데이타프레임1, 데이타프레임2)

In [75]:
pd.merge(df1, df2)
Out[75]:
고객번호 이름 금액
0 1001 둘리 10000
1 1001 둘리 20000
2 1001 둘리 30000
3 1005 희동 15000
4 1006 마이콜 5000

outer join 방식으로 병합하기

  • 키 값이 한쪽에만 있어도 데이터를 보여준다.
  • 없는 데이타값은 nan으로 표시된다.

pd.merge(데이타프레임1, 데이타프레임2, how='outer')

In [77]:
pd.merge(df1, df2, how='outer')
Out[77]:
고객번호 이름 금액
0 1001 둘리 10000.00
1 1001 둘리 20000.00
2 1001 둘리 30000.00
3 1002 도우너 nan
4 1003 또치 nan
5 1004 길동 nan
6 1005 희동 15000.00
7 1006 마이콜 5000.00
8 1007 영희 nan
9 1008 NaN 100000.00

left join 방식으로 병합하기

  • 첫번째 데이타프레임의 인덱스 키값을 모두 보여준다.

pd.merge(데이타프레임1, 데이타프레임2, how='left')

In [148]:
pd.merge(df1, df2, how='left')
Out[148]:
고객번호 이름 금액
0 1001 둘리 10000.00
1 1001 둘리 20000.00
2 1001 둘리 30000.00
3 1002 도우너 nan
4 1003 또치 nan
5 1004 길동 nan
6 1005 희동 15000.00
7 1006 마이콜 5000.00
8 1007 영희 nan

right join 방식으로 병합하기

  • 두번째 데이타프레임의 인덱스 키값을 모두 보여준다.

pd.merge(데이타프레임1, 데이타프레임2, how='right')

In [150]:
pd.merge(df1, df2, how='right')
Out[150]:
고객번호 이름 금액
0 1001 둘리 10000
1 1001 둘리 20000
2 1001 둘리 30000
3 1005 희동 15000
4 1006 마이콜 5000
5 1008 NaN 100000

퀴즈 1

아래와 같이 학생별로 각 과목의 총합과 평균을 구한 후 평균 80점이 넘으면 'True'를 출력한다.

In [82]:
 
Out[82]:
과학 국사 국어 수학 영어 총합 평균 합격여부
김남준 100 70 100 100 80 450 90.0 True
박지민 77 87 78 85 95 422 84.4 True
민윤기 77 60 78 89 88 392 78.4 False
김태형 100 79 99 90 77 445 89.0 True
In [ ]:
 

Answer

In [59]:
data = {'수학':[100, 85, 89, 90],
       '영어':[80, 95, 88, 77],
       '과학':[100, 77, 77, 100],
       '국어':[100, 78, 78, 99 ],
        '국사':[70, 87, 60, 79]}

df = pd.DataFrame(data, index=['김남준', '박지민', '민윤기', '김태형'])
df
Out[59]:
수학 영어 과학 국어 국사
김남준 100 80 100 100 70
박지민 85 95 77 78 87
민윤기 89 88 77 78 60
김태형 90 77 100 99 79
In [57]:
# 평균값을 구할 수 없다 
# df['총합'] = df.sum(axis=1)
# df['평균'] = df.mean(axis=1)
# df['합격여부'] = df['평균'] > 80
# df
In [65]:
# 총합을 구하는 시리즈 
s1 = df.sum(axis=1)
In [66]:
# 평균을 구하는 시리즈 
s2 = df.mean(axis=1)
In [64]:
# 새로운 컬럼에 시리즈에서 구한 합과 평균 추가하기 
df['총합'] = s1
df['평균'] = s2
df['합격여부'] = df['평균'] > 80
df
Out[64]:
수학 영어 과학 국어 국사 총합 평균 합격여부
김남준 100 80 100 100 70 450 90.00 True
박지민 85 95 77 78 87 422 84.40 True
민윤기 89 88 77 78 60 392 78.40 False
김태형 90 77 100 99 79 445 89.00 True

퀴즈 2

아래와 같은 구조로 population_A, population_B 데이타 프레임을 생성한다. 생성한 데이타프레임 2개를 전치행열로 변경한 후 병합한다.

전치행렬 문법 : 데이타프레임.T


population_A = pd.DataFrame( {'Nation':['중국','인도','미국'],
                              'Population':[1420047, 1368693, 329086],
                               'Percent':[18.54, 17.74, 4.28]  })

population_B = pd.DataFrame( {'Nation':['일본','베트남','터키'],
                              'Population':[126856, 97426, 82959 ],
                               'Percent':[1.67, 1.26, 1.08]  })
In [143]:
 
Out[143]:
1 2 3 4 5 6
Nation 중국 인도 미국 일본 베트남 터키
Percent 18.54 17.74 4.28 1.67 1.26 1.08
Population 1420047 1368693 329086 126856 97426 82959

퀴즈 3

2개의 데이타 프레임을 하나의 데이타프레임으로 병합한다.

기준열은 서로 다른 컬럼명으로 '구단주'와 'club' 이다

In [189]:
 
Out[189]:
감독 구단명 우승횟수
0 최강희 전북현대 4
1 황선홍 FC서울 3
2 김도훈 울산현대 2
3 최순호 포항스틸러스 5
4 조성환 제주유나이티드 0
In [190]:
 
Out[190]:
club 소유주 수용인원 홈구장
0 전북현대 현대자동차 42477 전주월드컵경기장
1 FC서울 GS그룹 66704 서울월드컵경기장
2 울산현대 현대중공업 44102 울산문수축구경기장
3 포항스틸러스 포항제철 25000 포항스틸야드
4 제주유나이티드 SK에너지 29791 제주월드컵경기장
In [191]:
 
Out[191]:
감독 구단명 우승횟수 club 소유주 수용인원 홈구장
0 최강희 전북현대 4 전북현대 현대자동차 42477 전주월드컵경기장
1 황선홍 FC서울 3 FC서울 GS그룹 66704 서울월드컵경기장
2 김도훈 울산현대 2 울산현대 현대중공업 44102 울산문수축구경기장
3 최순호 포항스틸러스 5 포항스틸러스 포항제철 25000 포항스틸야드
4 조성환 제주유나이티드 0 제주유나이티드 SK에너지 29791 제주월드컵경기장
In [ ]:
 
반응형

'Python > Pandas' 카테고리의 다른 글

Pandas_06. 타이타닉  (0) 2019.08.26
Pandas_05  (0) 2019.08.11
Pandas_03  (0) 2019.08.11
Pandas_02  (0) 2019.08.11
Pandas_01  (0) 2019.08.11