UOMOP
판다스(Pandas) - 2 : 데이터 selection 및 filtering 본문
DataFrame의 []연산자
- 넘파이에서 []연산자는 행의 위, 열의 위치, 슬라이싱 범위 등을 지정해 데이터를 가져올 수 있다.
- 하지만 DataFrame 바로 뒤에 있는 '[]'안에 들어갈 수 있는 것은 컬럼 명 문자, 또는 인덱스로 변환 가능한 표현식이다.
import pandas as pd
titanic_df = pd.read_csv("titanic_train.csv")
print("단일 컬럼 데이터 추출 : \n{}".format(titanic_df["Pclass"].head(3)))
print("")
print("여러 컬럼들의 데이터 추출 : \n{}".format(titanic_df[["Survived", "Pclass"]].head(3)))
print("")
print("[] 안에 숫자 index는 KeyError 오류 발생 : {}".format(titanic_df[0]))
titanic_df[ titanic_df["Pclass"] == 3 ].head(3)
DataFrame iloc[ ]연산자 : 위치기반 인덱싱
data = {"Name" : ["Dowon", "Junho", "Bomi", "Youngsu"],
"Year" : [2011, 2016, 2015, 2015],
"Gender" : ["Male", "Male", "Female", "Male"]}
data_df = pd.DataFrame(data, index = ["one", "two", "three", "four"])
data_df
data_df.iloc[0, 0]
'Dowon'
data_df.iloc[0, 1]
2011
DataFrame loc[ ] 연산자 : 명칭기반 인덱싱
data_df
data_df.loc["two", "Year"]
2016
data_df.loc["four", "Gender"]
'Male'
iloc[ ], loc[ ]를 사용한 slicing
data_df
print("위치 기반 인덱싱 iloc[ ]로 slice! : \n{}".format(data_df.iloc[0:3, 1]))
print("-"*35)
print("명칭 기반 인덱싱 loc[ ]로 slice! : \n{}".format(data_df.loc["one" : "three", "Name"]))
불린 인덱싱(Boolean indexing)
- 헷갈리는 위치기반, 명칭기반 인덱싱을 사용할 필요없이 조건식을 [ ]안에 기입하여 간편하게 필터링을 수행
titanic_df = pd.read_csv("titanic_train.csv")
titanic_boolean = titanic_df[ titanic_df["Age"] > 60 ]
print(type(titanic_boolean))
titanic_boolean
<class 'pandas.core.frame.DataFrame'>
titanic_df["Age"] > 60
var1 = titanic_df["Age"] > 60
print(type(var1))
<class 'pandas.core.series.Series'>
titanic_df[titanic_df["Age"] > 60][["Name", "Age"]].head(3)
titanic_df[["Name", "Age"]][titanic_df["Age"] > 60].head(3)
titanic_df.loc[titanic_df["Age"] > 60, ["Name", "Age"]].head(3)
titanic_df[ (titanic_df["Age"] > 60) & (titanic_df["Pclass"] == 1) & (titanic_df["Sex"] == "female") ]
- 논리 연산자로 결합된 조건식도 불린 인덱싱으로 적용 가능
cond1 = titanic_df["Age"] > 60
cond2 = titanic_df["Pclass"] == 1
cond3 = titanic_df["Sex"] == "female"
titanic_df[cond1 & cond2 & cond3]
- 조건식은 변수로도 할당 가능. 복잡한 조건식은 변수로 할당하여 가독성을 향상
Aggregation 함수
titanic_df.count()
titanic_df[["Fare", "Age"]].mean()
Fare 32.204208
Age 29.699118
dtype: float64
titanic_df[["Age", "Fare"]].sum()
Age 21205.1700
Fare 28693.9493
dtype: float64
titanic_df[["Age", "Fare"]].sum(axis=1)
titanic_df[["Age", "Fare"]].count()
Age 714
Fare 891
dtype: int64
groupby()
- groupby() by 인자에 Group By 하고자 하는 컬럼을 입력, 여러개의 컬럼으로 Group By하고자 하면 [ ] 내에 해당 컬럼명 입력.
- DataFrame에 groupby()를 호출하면 DataFrameGroupBy 객체를 반환.
titanic_groupby = titanic_df.groupby(by = "Pclass")
print(type(titanic_groupby))
print(titanic_groupby)
<class 'pandas.core.groupby.generic.DataFrameGroupBy'>
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x00000260EAE65610>
titanic_groupby= titanic_df.groupby("Pclass").count()
titanic_groupby
- 위 출력 결과에서 Pclass는 index이다.
print(type(titanic_groupby))
print(titanic_groupby.shape)
print(titanic_groupby.index)
<class 'pandas.core.frame.DataFrame'>
(3, 11)
Int64Index([1, 2, 3], dtype='int64', name='Pclass')
titanic_groupby = titanic_df.groupby(by = "Pclass")[["PassengerId", "Survived"]].count()
titanic_groupby
titanic_df[["Pclass", "PassengerId", "Survived"]].groupby("Pclass").count()
titanic_df.groupby("Pclass")["Pclass"].count()
Pclass
1 216
2 184
3 491
Name: Pclass, dtype: int64
titanic_df["Pclass"].value_counts()
3 491
1 216
2 184
Name: Pclass, dtype: int64
titanic_df.groupby("Pclass")["Age"].agg([max, min])
agg_format = {"Age" : "max", "SibSp" : "sum", "Fare" : "mean"}
titanic_df.groupby("Pclass").agg(agg_format)
Missing 데이터 처리하기
- DataFrame의 isna() 메소드는 모든 컬럼 값들이 NaN인지 True/False값을 반환(NaN이면 True)
isna( )
titanic_df.isna().head(3)
- NaN인 곳만 True가 된다
titanic_df.isna().sum()
- 컬럼 별로 NaN이 몇 개인지
fillna( )
titanic_df["Cabin"] = titanic_df["Cabin"].fillna("0000")
titanic_df.head(3)
titanic_df["Age"] = titanic_df["Age"].fillna(titanic_df["Age"].mean())
titanic_df["Embarked"] = titanic_df["Embarked"].fillna("S")
titanic_df.isna().sum()
apply lambda 식으로 데이터 가공
파이썬 lambda식 기본
def get_square(a) :
return a**2
print("3의 제곱은 {}".format(get_square(3)))
3의 제곱은 9
lambda_square = lambda x : x**2
print("3의 제곱은 {}".format(lambda_square(3)))
3의 제곱은 9
a = [1, 2, 3]
squares = map(lambda x : x**2, a)
list(squares)
[1, 4, 9]
판다스에 apply lambda식 적용
titanic_df["Name_len"] = titanic_df["Name"].apply(lambda x : len(x))
titanic_df[["Name", "Name_len"]].head(3)
titanic_df["Child_Adult"] = titanic_df["Age"].apply(lambda x : "Child" if x <= 15 else "Adult")
titanic_df[["Age", "Child_Adult"]].head(10)
titanic_df["Age_cat"] = titanic_df["Age"].apply(lambda x : "Child" if x <= 15 else("Adult" if x <= 60 else "Elderly"))
titanic_df["Age_cat"].value_counts()
Adult 786
Child 83
Elderly 22
Name: Age_cat, dtype: int64
def get_category(age):
cat = ""
if age <= 5 : cat = "Baby"
elif age <= 12 : cat = "Child"
elif age <= 18 : cat = "Teen"
elif age <= 25 : cat = "Student"
elif age <= 35 : cat = "Young Adult"
elif age <= 60 : cat = "Adult"
else : cat = "Elderly"
return cat
titanic_df["Age_cat"] = titanic_df["Age"].apply(lambda x : get_category(x))
titanic_df[["Age", "Age_cat"]].head()
'Summary > Ai' 카테고리의 다른 글
판다스(Pandas) - 1 (0) | 2022.01.18 |
---|---|
넘파이(Numpy) (0) | 2022.01.18 |
Comments