본문 바로가기
개발일지/Pandas

pandas (판다스) 기초 7 filtering

by 다니엘의 개발 이야기 2022. 7. 18.
320x100
# DataFrame Basics II

## Filtering DataFrames with one Condition

import pandas as pd

titanic = pd.read_csv('titanic.csv')
titanic.head()
# 이 연산은 백터 연산이 된 것이므로, 반복문이 필요 없다.
titanic.sex == 'male'

'''
0       True
1      False
2      False
3      False
4       True
       ...  
886     True
887    False
888    False
889     True
890     True
Name: sex, Length: 891, dtype: bool
'''
# 이 방법은 numpy 와 같은 방법으로써 titanic.sex에서 male 에 속한 값만을 필터링해서 리턴하는 것이다.
# filtering의 핵심은 True 값으로 반환 되는 행에 대해서만 리턴을 해준다는 것이다.

titanic[titanic.sex == 'male']


'''
    survived	pclass	sex	age	sibsp	parch	fare	embarked	deck
0	0	3	male	22.0	1	0	7.2500	S	NaN
4	0	3	male	35.0	0	0	8.0500	S	NaN
5	0	3	male	NaN	0	0	8.4583	Q	NaN
6	0	1	male	54.0	0	0	51.8625	S	E
7	0	3	male	2.0	3	1	21.0750	S	NaN
...	...	...	...	...	...	...	...	...	...
883	0	2	male	28.0	0	0	10.5000	S	NaN
884	0	3	male	25.0	0	0	7.0500	S	NaN
886	0	2	male	27.0	0	0	13.0000	S	NaN
889	1	1	male	26.0	0	0	30.0000	C	C
890	0	3	male	32.0	0	0	7.7500	Q	NaN
577 rows × 9 columns
'''
# 만약 filtering을 했고, filtering 한 값중에서 fare 열값만 보여주고 싶다면
# 방법1은 loc을 써서 이렇게 하면 된다

titanic.loc[titanic.sex == 'male','fare']


'''
0       7.2500
4       8.0500
5       8.4583
6      51.8625
7      21.0750
        ...   
883    10.5000
884     7.0500
886    13.0000
889    30.0000
890     7.7500
Name: fare, Length: 577, dtype: float64
'''
# 방법 2는 체인인덱싱이라고 부르는 기법으로써 대괄호 두개를 연달아 쓰는 방법이다.
# 하지만 이 방법이 나에겐 편하지만, 전체적으로는 문제를 야기할 수 있다고 한다.
# 방법 1을 추천한다고한다.

titanic[titanic.sex == 'male']['fare']
'''
0       7.2500
4       8.0500
5       8.4583
6      51.8625
7      21.0750
        ...   
883    10.5000
884     7.0500
886    13.0000
889    30.0000
890     7.7500
Name: fare, Length: 577, dtype: float64
'''
mask1 = titanic.sex == 'male'
mask1
# titanic[mask1]과
titanic_male = titanic.loc[mask1]
# 은 같은 결과값을 가지고 있다.
titanic_male.head()
titanic.dtypes

'''
survived      int64
pclass        int64
sex          object
age         float64
sibsp         int64
parch         int64
fare        float64
embarked     object
deck         object
dtype: object
'''
# titanic의 dtypes를 보면 sex, embarked, deck에 대하여 object 값으로 박혀있다.
# 이것들을 필터링하여서 이것들 만 나오게 하거나, 이것들 만 안나오게 할 수도 있다.

mask2 = titanic.dtypes == object
mask2

'''
survived    False
pclass      False
sex          True
age         False
sibsp       False
parch       False
fare        False
embarked     True
deck         True
dtype: bool
'''
# 이렇게 하면, mask2로 씌워진 object 값에 대해서만 리턴하고
titanic.loc[:, mask2]
# 이렇게 하면 object가 아니였던 값에 대해서만 리턴이 된다.
titanic.loc[:, ~mask2]
# 여기까지 mask1, mask2를 만들었다.
# mask1의 결과물은 sex가 male 경우만.
# mask2의 결과물은 dtypes가 object인 경우를 말했다.
# 이 둘을 함께 필터링해주게 되면

titanic.loc[mask1, mask2]

# dtypes가 object이면서 sex 가 male인 것만 출력된다.

'''
    sex	embarked	deck
0	male	S	NaN
4	male	S	NaN
5	male	Q	NaN
6	male	S	E
7	male	S	NaN
...	...	...	...
883	male	S	NaN
884	male	S	NaN
886	male	S	NaN
889	male	C	C
890	male	Q	NaN
577 rows × 3 columns
'''
# 즉, 위의 것들을 응용하자면
titanic.loc[~mask1, ~mask2]

'''
	survived	pclass	age	sibsp	parch	fare
1	1	1	38.0	1	0	71.2833
2	1	3	26.0	0	0	7.9250
3	1	1	35.0	1	0	53.1000
8	1	3	27.0	0	2	11.1333
9	1	2	14.0	1	0	30.0708
...	...	...	...	...	...	...
880	1	2	25.0	0	1	26.0000
882	0	3	22.0	0	0	10.5167
885	0	3	39.0	0	5	29.1250
887	1	1	19.0	0	0	30.0000
888	0	3	NaN	1	2	23.4500
314 rows × 6 columns
'''

# 이런값이 나올 수도 있다.
# male이 아니면서, dtypes가 object가 아닌 경우
300x250