본문 바로가기

Python/Pandas

Pandas_03

반응형
day3_pandas1
In [3]:
import numpy as np
import pandas as pd

Dataframe Boolean Index

  • 데이타프레임 인덱스시 사용됨
  • 마스크(Mask)라고도 함
  • 조건에 맞으면 결과값이 True/False 형태의 Boolean으로 표시
  • df.loc [ df[ 컬럼인덱스] 비교연산자 ]
  • df.loc [ df[ 행인덱스] 비교연산자 ]
  • 다중 조건시 논리 연산자 사용
In [42]:
data = { "year":[2014, 2015, 2016, 2015, 2017,2013]
        ,"name":['Haidi', 'Haidi', 'Haidi', 'Charles', 'Charles',  'Hayoung']
        , "points":[1.5, 1.7, 3.6, 2.5, 2.9, 4.0]
        , "penalty":[0.1,0.2, 0.3,0.4,0.5,0.1 ]
        , "net_points":[1.4,1.5,3.3,2.1,2.4,2.1]
        , "bonus":[10,20,30,40,50,60]}
df = pd.DataFrame(data, 
                 columns=["year","name","points",
                           "penalty","net_points","bonus"],
                 index=["one", "two", "three", "four", "five","six"])
df
Out[42]:
year name points penalty net_points bonus
one 2014 Haidi 1.5 0.1 1.4 10
two 2015 Haidi 1.7 0.2 1.5 20
three 2016 Haidi 3.6 0.3 3.3 30
four 2015 Charles 2.5 0.4 2.1 40
five 2017 Charles 2.9 0.5 2.4 50
six 2013 Hayoung 4.0 0.1 2.1 60

비교연산자를 이용하여 시리즈 생성

In [3]:
df["year"] > 2014
Out[3]:
one      False
two       True
three     True
four      True
five      True
six      False
Name: year, dtype: bool

조건에 맞는 행 추출하기

  • df.loc [ df[ 행인덱스] 비교연산자 ]
In [7]:
df.loc[df["year"]>2014, :]
Out[7]:
year name points penalty net_points bonus
two 2015 Haidi 1.7 0.2 1.5 20
three 2016 Haidi 3.6 0.3 3.3 30
four 2015 Charles 2.5 0.4 2.1 40
five 2017 Charles 2.9 0.5 2.4 50

조건에 맞는 행과 열 추출하기

In [9]:
df["name"]== "Charles"
Out[9]:
one      False
two      False
three    False
four      True
five      True
six      False
Name: name, dtype: bool
In [10]:
df.loc[df["name"]== "Charles", ["name", "points"]]
Out[10]:
name points
four Charles 2.5
five Charles 2.9

비교 연산자 이용하기 - & and

In [11]:
df["points"] > 2
Out[11]:
one      False
two      False
three     True
four      True
five      True
six       True
Name: points, dtype: bool
In [12]:
df["points"] < 3
Out[12]:
one       True
two       True
three    False
four      True
five      True
six      False
Name: points, dtype: bool
In [6]:
df.loc[ (df["points"] > 2) & (df["points"] < 3), :]
Out[6]:
year name points penalty net_points bonus
four 2015 Charles 2.5 0.4 2.1 40
five 2017 Charles 2.9 0.5 2.4 50
In [13]:
df.loc[ (df["points"] > 2) & (df["points"] < 3), ["name", "points"]]
Out[13]:
name points
four Charles 2.5
five Charles 2.9

Boolean Indexing 처리 후에 새로운 값 입력하기

In [14]:
df
Out[14]:
year name points penalty net_points bonus
one 2014 Haidi 1.5 0.1 1.4 10
two 2015 Haidi 1.7 0.2 1.5 20
three 2016 Haidi 3.6 0.3 3.3 30
four 2015 Charles 2.5 0.4 2.1 40
five 2017 Charles 2.9 0.5 2.4 50
six 2013 Hayoung 4.0 0.1 2.1 60
In [15]:
df["points"] > 3
Out[15]:
one      False
two      False
three     True
four     False
five     False
six       True
Name: points, dtype: bool
In [16]:
df.loc[df["points"] > 3, :]
Out[16]:
year name points penalty net_points bonus
three 2016 Haidi 3.6 0.3 3.3 30
six 2013 Hayoung 4.0 0.1 2.1 60
In [17]:
df.loc[df["points"] > 3, "penalty"]
Out[17]:
three    0.3
six      0.1
Name: penalty, dtype: float64
In [43]:
df.loc[df["points"] > 3, "penalty"] = 0
In [44]:
df
Out[44]:
year name points penalty net_points bonus
one 2014 Haidi 1.5 0.1 1.4 10
two 2015 Haidi 1.7 0.2 1.5 20
three 2016 Haidi 3.6 0.0 3.3 30
four 2015 Charles 2.5 0.4 2.1 40
five 2017 Charles 2.9 0.5 2.4 50
six 2013 Hayoung 4.0 0.0 2.1 60

퀴즈

  • 위의 데이타프레임에서 bonus > 40 를 80으로 변경하여라
  • 위의 데이타프레임에서 name 이 'Haidi인 net_points 값을 0으로 변경하여라
In [45]:
df.loc[df["bonus"] > 40, "bonus"] = 40
df
Out[45]:
year name points penalty net_points bonus
one 2014 Haidi 1.5 0.1 1.4 10
two 2015 Haidi 1.7 0.2 1.5 20
three 2016 Haidi 3.6 0.0 3.3 30
four 2015 Charles 2.5 0.4 2.1 40
five 2017 Charles 2.9 0.5 2.4 40
six 2013 Hayoung 4.0 0.0 2.1 40
In [46]:
df["name"] == 'Haidi'
Out[46]:
one       True
two       True
three     True
four     False
five     False
six      False
Name: name, dtype: bool
In [47]:
df.loc[df["name"] == 'Haidi', 'net_points'] = 0
df
Out[47]:
year name points penalty net_points bonus
one 2014 Haidi 1.5 0.1 0.0 10
two 2015 Haidi 1.7 0.2 0.0 20
three 2016 Haidi 3.6 0.0 0.0 30
four 2015 Charles 2.5 0.4 2.1 40
five 2017 Charles 2.9 0.5 2.4 40
six 2013 Hayoung 4.0 0.0 2.1 40

Dataframe – 랜덤 숫자로 구성

  • 데이타프레임이름 = pd.DataFrame(np.random.randn(행수,열수))
In [29]:
# 넘파이 랜덤 숫자를 이용하여 데이타프레임 생성하기
df = pd.DataFrame(np.random.randn(6,4))

Dataframe – 컬럼 이름

-데이타프레임.columns=[컬럼리스트]

In [32]:
df.columns = ["A","B","C","D"]
df
Out[32]:
A B C D
0 0.715571 0.981409 -0.187524 -1.083537
1 -0.345693 0.656586 -1.026977 1.184549
2 0.344443 -0.642719 -0.387711 2.328143
3 0.836985 -0.067219 -0.492825 0.575603
4 -1.844788 -0.222667 3.236973 -0.851837
5 -1.124374 0.875551 -0.013505 -1.475420
In [34]:
df.index = ['row1','row2','row3','row4','row5','row6']
df
Out[34]:
A B C D
row1 0.715571 0.981409 -0.187524 -1.083537
row2 -0.345693 0.656586 -1.026977 1.184549
row3 0.344443 -0.642719 -0.387711 2.328143
row4 0.836985 -0.067219 -0.492825 0.575603
row5 -1.844788 -0.222667 3.236973 -0.851837
row6 -1.124374 0.875551 -0.013505 -1.475420

Dataframe – 날짜 데이터

  • pd.date_range() 함수는 날짜 생성 - 초기날짜, 단계
  • pd.date_range( 초기날짜, periods=숫자)
In [38]:
# 인덱스로 사용할 날짜 인덱스 리스트 생성 
df_date = pd.date_range("20190731", periods=10)
df_date
Out[38]:
DatetimeIndex(['2019-07-31', '2019-08-01', '2019-08-02', '2019-08-03',
               '2019-08-04', '2019-08-05', '2019-08-06', '2019-08-07',
               '2019-08-08', '2019-08-09'],
              dtype='datetime64[ns]', freq='D')
In [40]:
df = pd.DataFrame(np.random.randn(10,4), columns=["A","B","C","D"])
df
Out[40]:
A B C D
0 -1.352134 -0.637957 0.126441 -1.413039
1 0.080201 1.517937 0.635509 -0.328953
2 0.108660 2.040266 -0.883875 -0.459062
3 1.582274 -0.382778 -0.474308 0.284829
4 -0.729637 -0.411745 0.499085 0.784131
5 0.882646 0.748589 -1.341932 -1.023609
6 0.934509 0.621713 -1.502488 0.651579
7 0.820231 0.980239 2.214970 -1.071494
8 1.129923 0.649801 2.012117 0.433146
9 0.352361 -2.120228 0.441510 1.758508

날짜 인덱스를 데이타프레임 인덱스로 지정

데이타프레임.index = 날짜인덱스변수

In [41]:
df.index = df_date
df
Out[41]:
A B C D
2019-07-31 -1.352134 -0.637957 0.126441 -1.413039
2019-08-01 0.080201 1.517937 0.635509 -0.328953
2019-08-02 0.108660 2.040266 -0.883875 -0.459062
2019-08-03 1.582274 -0.382778 -0.474308 0.284829
2019-08-04 -0.729637 -0.411745 0.499085 0.784131
2019-08-05 0.882646 0.748589 -1.341932 -1.023609
2019-08-06 0.934509 0.621713 -1.502488 0.651579
2019-08-07 0.820231 0.980239 2.214970 -1.071494
2019-08-08 1.129923 0.649801 2.012117 0.433146
2019-08-09 0.352361 -2.120228 0.441510 1.758508

퀴즈

1~100 사이의 숫자중 30개를 추출한 후 날짜 인덱스를 이용하여 5행 6열의 데이타프레임을 생성하여라

In [51]:
df2 = pd.DataFrame( np.random.randint(1,101, size=30).reshape(5,6),
                      index = pd.date_range("20190731", periods=5)
                      )
df2
Out[51]:
0 1 2 3 4 5
2019-07-31 84 63 7 9 12 42
2019-08-01 85 66 67 84 3 52
2019-08-02 46 1 76 94 73 36
2019-08-03 94 87 67 34 73 54
2019-08-04 88 8 85 8 84 19

결측치관련 함수

  • 결측치란? 데이타가 없다
  • NaN : Not a Number

  • 결측치가 있다면 행 모두 삭제

    데이타프레임.dropna(how='any')
    데이타프레임.dropna(how='all')
  • 결측치 값을 특정 값으로 교체

    데이타프레임이름.fillna(value=값)
  • 결측치가 있는 셀은 True로 표시

    데이타프레임이름.isnull()
    데이타프레임이름.loc(데이타프레임이름.isnull(), :)

Dataframe – np.nan 값 입력하기

In [54]:
df = pd.DataFrame(np.random.randn(5,4), 
                  index = pd.date_range("20190731", periods=5),
                  columns=["A","B","C","D"])

F컬럼 추가하기

In [55]:
df["F"] = [1.0, np.nan, 3.5, 6.1, np.nan]
df
Out[55]:
A B C D F
2019-07-31 -0.497871 0.675525 0.928600 -0.260521 1.0
2019-08-01 0.970721 -0.931714 -0.139314 -0.110461 NaN
2019-08-02 0.207367 -0.106493 -0.007360 1.064639 3.5
2019-08-03 -1.181030 1.547550 0.412523 -0.478629 6.1
2019-08-04 0.855016 0.576939 0.270907 -0.805470 NaN

결측치가 하나라도 있으면 행 모두 삭제하기

  • 데이타프레임이름.dropna(how="any")
In [56]:
df
Out[56]:
A B C D F
2019-07-31 -0.497871 0.675525 0.928600 -0.260521 1.0
2019-08-01 0.970721 -0.931714 -0.139314 -0.110461 NaN
2019-08-02 0.207367 -0.106493 -0.007360 1.064639 3.5
2019-08-03 -1.181030 1.547550 0.412523 -0.478629 6.1
2019-08-04 0.855016 0.576939 0.270907 -0.805470 NaN
In [57]:
df.dropna(how="any")
Out[57]:
A B C D F
2019-07-31 -0.497871 0.675525 0.928600 -0.260521 1.0
2019-08-02 0.207367 -0.106493 -0.007360 1.064639 3.5
2019-08-03 -1.181030 1.547550 0.412523 -0.478629 6.1
In [58]:
df
Out[58]:
A B C D F
2019-07-31 -0.497871 0.675525 0.928600 -0.260521 1.0
2019-08-01 0.970721 -0.931714 -0.139314 -0.110461 NaN
2019-08-02 0.207367 -0.106493 -0.007360 1.064639 3.5
2019-08-03 -1.181030 1.547550 0.412523 -0.478629 6.1
2019-08-04 0.855016 0.576939 0.270907 -0.805470 NaN

inplace=True 사용하기

In [59]:
df.dropna(how="any", inplace=True)
In [60]:
df
Out[60]:
A B C D F
2019-07-31 -0.497871 0.675525 0.928600 -0.260521 1.0
2019-08-02 0.207367 -0.106493 -0.007360 1.064639 3.5
2019-08-03 -1.181030 1.547550 0.412523 -0.478629 6.1
In [ ]:
 

NaN 값이 모두 들어있는 행 삭제하기

  • 데이타프레임이름.dropna(how="all") : 원본의 데이타가 삭제되지 않는다.
  • 데이타프레임이름.dropna(how="all", inplace=True ) : 원본 데이타도 삭제
In [67]:
data = {"a":[2,np.NAN,3],
        "b":[np.NAN,np.NAN,np.NAN],
        "c":[1,np.NAN,np.NAN]}
df = pd.DataFrame(data)
In [70]:
df.dropna(how="all", inplace=True)
In [71]:
df
Out[71]:
a b c
0 2.0 NaN 1.0
2 3.0 NaN NaN

컬럼 추가하기

데이타프레임['d'] = 리스트

행 추가하기

데이타프레임.loc[인덱스명, :] = 리스트

Dataframe – NaN값에 특정 값 입력하기

  • 데이타프레임이름.fillna(value=값)
  • 데이타프레임이름.fillna(value=값, inplace=True)
In [72]:
data = {"a":[2,np.NAN,3],
        "b":[np.NAN,np.NAN,np.NAN],
        "c":[1,np.NAN,np.NAN]}
df = pd.DataFrame(data)
df
Out[72]:
a b c
0 2.0 NaN 1.0
1 NaN NaN NaN
2 3.0 NaN NaN
In [73]:
df.fillna(value=3.0)
Out[73]:
a b c
0 2.0 3.0 1.0
1 3.0 3.0 3.0
2 3.0 3.0 3.0
In [75]:
df
Out[75]:
a b c
0 2.0 NaN 1.0
1 NaN NaN NaN
2 3.0 NaN NaN
In [76]:
# df=df.fillna(value=3.0)
df.fillna(value=3.0, inplace=True)
df
Out[76]:
a b c
0 2.0 3.0 1.0
1 3.0 3.0 3.0
2 3.0 3.0 3.0

NaN값에 Boolean 마스크 실행하기

  • 데이타프레임.isnull()
  • 결과값이 Boolean Index 처럼 True/False로 표시
  • NaN 값이 있는 셀은 True로 표시
In [21]:
data = {"a":[2,np.NAN,3],
        "b":[np.NAN,np.NAN,np.NAN],
        "c":[1,np.NAN,np.NAN]}
In [22]:
df = pd.DataFrame(data)
df
Out[22]:
a b c
0 2.0 NaN 1.0
1 NaN NaN NaN
2 3.0 NaN NaN

NaN 값이 있는 셀은 True로 표시된다.

In [23]:
df.isnull()
Out[23]:
a b c
0 False True False
1 True True True
2 False True True

NaN 값이 들어있는 셀의 행 추출하기

  • 데이타프레임.loc[데이타프레임.isnull()[NaN값이 있는 열], :]

5행3열의 데이타프레임 생성후 특정 값을 결측치로 교체하기

In [80]:
df = pd.DataFrame(np.random.randn(5,3), columns=["A","B","C"])
df
Out[80]:
A B C
0 1.800016 -0.646571 0.160968
1 -1.383847 -0.254167 0.399887
2 -2.792351 -1.356415 -0.492873
3 -0.296852 0.255978 0.803209
4 1.116619 0.969066 -0.759911
In [84]:
df.loc[0,"A"] = np.NaN
df.loc[4,"A"] = np.NaN
df.loc[3,"C"] = np.NaN
df
Out[84]:
A B C
0 NaN -0.646571 0.160968
1 -1.383847 -0.254167 0.399887
2 -2.792351 -1.356415 -0.492873
3 -0.296852 0.255978 NaN
4 NaN 0.969066 -0.759911

"A" 컬럼에 NaN이 있는 행 추출

In [85]:
df.isnull()["A"]
Out[85]:
0     True
1    False
2    False
3    False
4     True
Name: A, dtype: bool

df.loc[조건식]을 이용해서 A 컬럼에 NaN이 있는 행 추출하기

In [89]:
df.loc[df.isnull()["A"]]
Out[89]:
A B C
0 NaN -0.646571 0.160968
4 NaN 0.969066 -0.759911
In [90]:
df.loc[df.isnull()["A"],['B']]
Out[90]:
B
0 -0.646571
4 0.969066
In [ ]:
 
반응형

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

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