Pandas

[Pandas / 기초] 판다스 데이터선택 - 조건(and, &, or, |, str함수, startswith, contains, isin, where)

씨주 2024. 1. 10. 15:39

📍 데이터 선택(조건)

 

✅ 엑셀로 열기

: pd.read_excel('파일명.xlsx', index_col='column')

 

✅ 조건에 해당하는 데이터선택

: df[filter]

 

df[~filter]

  filter를 역으로 적용

 

df[filter, [column_list]]

✅ & (and) 그리고

: 조건 모두 충족해야 함

 

✅ | (or) 또는

: 조건 중 하나만 충족하면 됨

 

✅ str함수(startswith)

: df['column'].str.startswith('str')

  'str'로 시작하는 데이터

 

✅ str함수(contains)

: df['column'].str.contains('str')

  'str'가 포함되어있는 데이터

 

: df['column'].str.contains('str', na=True/False)

  NaN값이 있을 경우 error 발생

  이를 해결하기 위해 NaN값의 대체값 설정

In [12]:
filt = df['SW특기'].str.contains('Java')
df[filt]
 
더보기
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[21], line 2
      1 filt = df['SW특기'].str.contains('Java')
----> 2 df[filt]

File ~/anaconda3/lib/python3.11/site-packages/pandas/core/frame.py:3751, in DataFrame.__getitem__(self, key)
   3748     return self.where(key)
   3750 # Do we have a (boolean) 1d indexer?
-> 3751 if com.is_bool_indexer(key):
   3752     return self._getitem_bool_array(key)
   3754 # We are left with two options: a single key, and a collection of keys,
   3755 # We interpret tuples as collections only for non-MultiIndex

File ~/anaconda3/lib/python3.11/site-packages/pandas/core/common.py:134, in is_bool_indexer(key)
    130     na_msg = "Cannot mask with non-boolean array containing NA / NaN values"
    131     if lib.infer_dtype(key_array) == "boolean" and isna(key_array).any():
    132         # Don't raise on e.g. ["A", "B", np.nan], see
    133         #  test_loc_getitem_list_of_labels_categoricalindex_with_na
--> 134         raise ValueError(na_msg)
    135     return False
    136 return True

ValueError: Cannot mask with non-boolean array containing NA / NaN values
 
In [13]:
df['SW특기'].str.contains('Java')
 
Out[13]:
지원번호
1번    False
2번     True
3번     True
4번      NaN
5번      NaN
6번    False
7번    False
8번    False
Name: SW특기, dtype: object

 

In [14]:
df['SW특기'].str.contains('Java', na=True) # NaN데이터에 대해 True로 대체
 
Out[14]:
지원번호
1번    False
2번     True
3번     True
4번     True
5번     True
6번    False
7번    False
8번    False
Name: SW특기, dtype: bool
 
In [15]:
df['SW특기'].str.contains('Java', na=False) # NaN데이터에 대해 False로 대체
 
Out[15]:
지원번호
1번    False
2번     True
3번     True
4번    False
5번    False
6번    False
7번    False
8번    False
Name: SW특기, dtype: bool
 
In [16]:
filt = df['SW특기'].str.contains('Java', na=False)
df[filt]
 
Out[16]:
 

 

✅ str함수(isin)

: df['column'].isin('value')

  'value'와 일치하는 데이터 (대소문자 구분)