📍 데이터 선택(조건)
✅ 엑셀로 열기
: pd.read_excel('파일명.xlsx', index_col='column')
In [1]:
import pandas as pd
df = pd.read_excel('score.xlsx', index_col='지원번호') # index 설정
df
Out[1]:
✅ 조건에 해당하는 데이터선택
: df[filter]
In [2]:
df['키'] >= 185 # 학생들의 키가 185 이상인지 여부를 True/False
Out[2]:
지원번호
1번 True
2번 False
3번 False
4번 True
5번 True
6번 True
7번 True
8번 True
Name: 키, dtype: bool
In [3]:
filt = (df['키'] >= 185)
df[filt]
Out[3]:
: df[~filter]
filter를 역으로 적용
In [4]:
df[~filt]
Out[4]:
In [5]:
df[df['키'] >= 185]
Out[5]:
: df[filter, [column_list]]
In [6]:
df.loc[df['키'] >= 185, '수학'] # 키가 185 이상인 학생들의 수학 데이터
Out[6]:
지원번호
1번 100
4번 70
5번 10
6번 95
7번 45
8번 90
Name: 수학, dtype: int64
In [7]:
df.loc[df['키'] >= 185, ['이름', '수학', '과학']] # 키가 185 이상인 학생들의 이름, 수학, 과학 데이터
Out[7]:
✅ & (and) 그리고
: 조건 모두 충족해야 함
In [8]:
df.loc[(df['키'] >= 185) & (df['학교'] == '북산고')] # 키가 185 이상인 북산고 학생 데이터
Out[8]:
✅ | (or) 또는
: 조건 중 하나만 충족하면 됨
In [9]:
df.loc[(df['키'] < 170) | (df['키'] > 200)] # 키가 170보다 작거나 200보다 큰 학생 데이터
Out[9]:
✅ str함수(startswith)
: df['column'].str.startswith('str')
'str'로 시작하는 데이터
In [10]:
filt = df['이름'].str.startswith('송') # '송'씨 성을 가진 사람
df[filt]
Out[10]:
✅ str함수(contains)
: df['column'].str.contains('str')
'str'가 포함되어있는 데이터
In [11]:
filt = df['이름'].str.contains('태') # 이름에 '태'가 들어가는 사람
df[filt]
Out[11]:
: 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'와 일치하는 데이터 (대소문자 구분)
In [17]:
langs = ['Python', 'Java']
filt = df['SW특기'].isin(langs) # SW특기가 Python이거나 Java인 사람
df[filt]
Out[17]:
In [18]:
langs = ['python', 'java']
filt = df['SW특기'].str.lower().isin(langs) # SW특기를 소문자로 바꾼 후 필터링
df[filt]
Out[18]:
✅ where
: df.where(cond, other='value', axis=None, level=None, errors='raise', try_cast=False)
- cond : True/False로 판단될 수 있는 식
- other : condition을 만족하지 못하는 요소에 할당할 값
In [20]:
df['키'].where(df['키'] > 180, 0)
Out[20]:
지원번호
1번 197
2번 184
3번 0
4번 187
5번 188
6번 202
7번 188
8번 190
Name: 키, dtype: int64
In [22]:
# 전체 DataFrame에 적용 시 조건이 해당하는 값 외에는 모두 NaN
df.where(df['키'] > 180)
Out[22]:
참고 : 나도코딩 파이썬 코딩 무료 강의 (활용편5) - 데이터 분석 및 시각화, 이 영상 하나로 끝내세요
'Pandas' 카테고리의 다른 글
[Pandas / 기초] 판다스 데이터정렬 - sort_values, sort_index (0) | 2024.01.10 |
---|---|
[Pandas / 기초] 판다스 결측치 - isnull, notnull, isna, notna, fillna, dropna (0) | 2024.01.10 |
[Pandas / 기초] 판다스 데이터선택 - iloc (0) | 2024.01.10 |
[Pandas / 기초] 판다스 데이터선택 - loc (0) | 2024.01.10 |
[Pandas / 기초] 판다스 데이터선택 (1) | 2024.01.10 |