2. Subset Observations(Rows) (행 데이터 다루기)
In [1]:
from IPython.core.display import display, HTML
display(HTML("<style> .container{width:90% !important;}</style>"))
In [2]:
import pandas as pd
import numpy as np
In [3]:
# 데이터프레임 생성
df = pd.DataFrame(
                            {'a' : [4, 5, 6], 
                             'b' : [7, 8, 9],
                             'c' : [6, 9, 12]},
                            index = pd.MultiIndex.from_tuples( [('d', 1), ('d', 2), ('e', 2)] ,
                                                                                     names = ['n', 'v'] )
                                )

df
Out[3]:
a b c
n v
d 1 4 7 6
2 5 8 9
e 2 6 9 12

True/False (불린인덱싱)을 이용한 행 데이터 조회

In [4]:
# 기본적으로  <, >, = 와 같은 연산자를 이용하면 아래와 같이 불린 값이 반환된다.
df['a'] < 6
Out[4]:
n  v
d  1     True
   2     True
e  2    False
Name: a, dtype: bool
In [5]:
# True로 값을 반환한 행에 대해서만 데이터를 불러온다.
df[df['a'] < 6]
Out[5]:
a b c
n v
d 1 4 7 6
2 5 8 9

중복데이터 제거 : df.drop_duplicates( )

In [6]:
# 중복된 행을 가지는 임의의 데이터프레임 생성
df = pd.DataFrame(
                {'a' : [4, 5, 6, 6 ],
                 'b' : [7, 8, 9, 9],
                 'c' : [6, 9, 12, 12]},
                index = pd.MultiIndex.from_tuples(
                                    [('d', 1), ('d',2), ('e', 2), ('e', 3)],
                                    names = ['n', 'v']    )
                                )
df
Out[6]:
a b c
n v
d 1 4 7 6
2 5 8 9
e 2 6 9 12
3 6 9 12
In [7]:
# drop_duplicates을 수행하면 중복된 행을 제거해준다
df.drop_duplicates()
Out[7]:
a b c
n v
d 1 4 7 6
2 5 8 9
e 2 6 9 12
In [8]:
# 하지만 위의 코드를 실행 후 다시 데이터프레임을 불러오면 중복된 값이 그대로 살아있다.
df
Out[8]:
a b c
n v
d 1 4 7 6
2 5 8 9
e 2 6 9 12
3 6 9 12
In [9]:
# 결과를 데이터프레임에 적용하려면 아래와 같이 괄호 안에 inplace = True 추가하면 된다.
# df.drop_duplicates(inplace=True)

# 하지만 권장되는 방법은 아니며 주로 아래와 같이 기존 데이터 프레임에 덧씌우는 방식을 사용
df = df.drop_duplicates()
In [10]:
# 중복데이터가 제거된체 데이터프레임이 저장되었음을 확인할 수 있다.
df
Out[10]:
a b c
n v
d 1 4 7 6
2 5 8 9
e 2 6 9 12

Logic in 파이썬(판다스)

연산자 의미 연산자 의미
< Less than != Not equal to
> Greater than df['column명'].isin(values) value값을 포함하는지의 여부
== equal pd.isnull(obj) Null값 여부
<= Less than or equals pd.notnull(obj) Not Null 여부
>= Greater than or equals &, I , ~, ^, any( ) , df.all( ) and, or, not, xor, any, all
In [11]:
# 예시데이터 불러오기
import numpy as np

df = pd.DataFrame(
                {'a' : [4, 5, 6, 6, np.nan ],
                 'b' : [7, 8, 9, 9, np.nan],
                 'c' : [6, 9, 12, np.nan, 12]},
                index = pd.MultiIndex.from_tuples(
                                    [('d', 1), ('d',2), ('e', 2), ('e', 3), ('e', 4)],
                                    names = ['n', 'v']    )
                                )
df
Out[11]:
a b c
n v
d 1 4.0 7.0 6.0
2 5.0 8.0 9.0
e 2 6.0 9.0 12.0
3 6.0 9.0 NaN
4 NaN NaN 12.0

예시를 이용해서 로직 하나씩 실행해보기

In [12]:
df['a'] < 5
Out[12]:
n  v
d  1     True
   2    False
e  2    False
   3    False
   4    False
Name: a, dtype: bool
In [13]:
df['b'] != 7
Out[13]:
n  v
d  1    False
   2     True
e  2     True
   3     True
   4     True
Name: b, dtype: bool
In [14]:
df['a'] == 5
Out[14]:
n  v
d  1    False
   2     True
e  2    False
   3    False
   4    False
Name: a, dtype: bool
In [15]:
df['a'].isin([5])
Out[15]:
n  v
d  1    False
   2     True
e  2    False
   3    False
   4    False
Name: a, dtype: bool
In [16]:
pd.isnull(df)
Out[16]:
a b c
n v
d 1 False False False
2 False False False
e 2 False False False
3 False False True
4 True True False
In [17]:
# isnull() 과 sum() 을 같이 활용해서 null 값의 수를 셀 수 있다.
df['a'].isnull().sum()
Out[17]:
1
In [18]:
pd.notnull(df)
Out[18]:
a b c
n v
d 1 True True True
2 True True True
e 2 True True True
3 True True False
4 False False True
In [19]:
# isnull() 과 any()를 동시에 사용해서 null 값이 하나라도 있으면 True를 반환
df.isnull().any()
Out[19]:
a    True
b    True
c    True
dtype: bool
In [20]:
# isnull() 과 all()를 동시에 사용해서 모두 null 값이면 True를 반환
df.isnull().all()
Out[20]:
a    False
b    False
c    False
dtype: bool
In [21]:
# ~ 는 not 의 의미로 아래에서는 결국 Null이면 True를 반환
~df['a'].notnull()
Out[21]:
n  v
d  1    False
   2    False
e  2    False
   3    False
   4     True
Name: a, dtype: bool
In [22]:
# 데이터프레임에서는 and를 쓸 수 없고 & 를 사용해야함
df[(df['b']==7) and (df['a'] ==4) ]
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-22-6decfb4c32c4> in <module>
      1 # 데이터프레임에서는 and를 쓸 수 없고 & 를 사용해야함
----> 2 df[(df['b']==7) and (df['a'] ==4) ]

/anaconda3/lib/python3.7/site-packages/pandas/core/generic.py in __nonzero__(self)
   1476         raise ValueError("The truth value of a {0} is ambiguous. "
   1477                          "Use a.empty, a.bool(), a.item(), a.any() or a.all()."
-> 1478                          .format(self.__class__.__name__))
   1479 
   1480     __bool__ = __nonzero__

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
In [23]:
df[ (df['b']==7) & (df['a'] ==4) ]
Out[23]:
a b c
n v
d 1 4.0 7.0 6.0

데이터프레임의 일부샘플 조회하기

df.head( ) 와 df.tail( ) 을 이용한 조회

In [24]:
# 최초 n행 조회하기 (default는 5행)
df.head(2)
Out[24]:
a b c
n v
d 1 4.0 7.0 6.0
2 5.0 8.0 9.0
In [25]:
# 마지막 n행 조회하기 (default는 5행)
df.tail(2)
Out[25]:
a b c
n v
e 3 6.0 9.0 NaN
4 NaN NaN 12.0

df.sample( ) 을 이용한 샘플 추출

In [26]:
# 전체 데이터프레임에서 특정 비율만큼 샘플링하는 것
df.sample(frac=0.5) 
Out[26]:
a b c
n v
e 2 6.0 9.0 12.0
d 1 4.0 7.0 6.0
In [27]:
# 하지만 코드를 실행할 때마다 다른 샘플이 나옴
df.sample(frac=0.5) 
Out[27]:
a b c
n v
e 3 6.0 9.0 NaN
d 1 4.0 7.0 6.0
In [28]:
# 아래와 같이 난수값을 설정함으로써 일관된 샘플을 할 수 있다.
df.sample(frac=0.5, random_state=5) 
Out[28]:
a b c
n v
e 4 NaN NaN 12.0
d 1 4.0 7.0 6.0
In [29]:
# 샘플 갯수 설정
df.sample(n=3)
Out[29]:
a b c
n v
e 2 6.0 9.0 12.0
3 6.0 9.0 NaN
d 1 4.0 7.0 6.0

df.iloc[ ]와 콜론(:)을 이용한 데이터프레임 조회

In [30]:
# df.iloc[인덱스 시작: 인덱스 끝]
# iloc로 조회를 할 떄 인덱스 끝의 바로 앞 데이터까지만 조회가 된다.
df.iloc[2:4]  
Out[30]:
a b c
n v
e 2 6.0 9.0 12.0
3 6.0 9.0 NaN
In [31]:
# 콜론 앞에 아무것도 입력하지 않으면 첫 데이터부터 조회
df.iloc[:4]
Out[31]:
a b c
n v
d 1 4.0 7.0 6.0
2 5.0 8.0 9.0
e 2 6.0 9.0 12.0
3 6.0 9.0 NaN
In [32]:
# 음수값을 입력하면 뒤에서 몇번째인지를 나타냄
# 아래 코드는 뒤에서 두번째 행부터 끝까지 조회
df.iloc[-2:]
Out[32]:
a b c
n v
e 3 6.0 9.0 NaN
4 NaN NaN 12.0
In [33]:
# df.iloc 
df.iloc[2:4, 1:]
Out[33]:
b c
n v
e 2 9.0 12.0
3 9.0 NaN

df.nlargest( ) 과 df.nsmallest( )

In [34]:
# 샘플 데이터프레임 생성
df = pd.DataFrame(  { 'a' : [1, 10, 8, 11, -1],
                             'b' : list('abcde'),
                             'c' : [1.0, 2.0, np.nan, 3.0, 4.0]}  )
df
Out[34]:
a b c
0 1 a 1.0
1 10 b 2.0
2 8 c NaN
3 11 d 3.0
4 -1 e 4.0
In [35]:
# 가장 큰  a 값을 가진 행 조회
df.nlargest(1, 'a')
Out[35]:
a b c
3 11 d 3.0
In [36]:
#  a 값이 큰 순서대로 상위 3개 행 조회
df.nlargest(3, 'a')
Out[36]:
a b c
3 11 d 3.0
1 10 b 2.0
2 8 c NaN
In [37]:
# 문자열에는 사용할 수 없음
df.nlargest(2, 'b')
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-37-b38daf335006> in <module>
      1 # 문자열에는 사용할 수 없음
----> 2 df.nlargest(2, 'b')

/anaconda3/lib/python3.7/site-packages/pandas/core/frame.py in nlargest(self, n, columns, keep)
   4909                                        n=n,
   4910                                        keep=keep,
-> 4911                                        columns=columns).nlargest()
   4912 
   4913     def nsmallest(self, n, columns, keep='first'):

/anaconda3/lib/python3.7/site-packages/pandas/core/algorithms.py in nlargest(self)
   1056 
   1057     def nlargest(self):
-> 1058         return self.compute('nlargest')
   1059 
   1060     def nsmallest(self):

/anaconda3/lib/python3.7/site-packages/pandas/core/algorithms.py in compute(self, method)
   1172                     "Column {column!r} has dtype {dtype}, cannot use method "
   1173                     "{method!r} with this dtype"
-> 1174                 ).format(column=column, dtype=dtype, method=method))
   1175 
   1176         def get_indexer(current_indexer, other_indexer):

TypeError: Column 'b' has dtype object, cannot use method 'nlargest' with this dtype
In [38]:
#  a 값이 작은 순서대로 상위 3개 행 조회
df.nsmallest(3, 'a')
Out[38]:
a b c
4 -1 e 4.0
0 1 a 1.0
2 8 c NaN

+ Recent posts