스터디/Data

[Imple] 데이터 프레임

_leezoee_ 2024. 2. 18. 18:41

 

 

데이터 프레임 기초

 

학습 데이

 

 

 

* 데이터 프레임 필터링

데이터 필터 (불리언 값들로 이루어진 새로운 시리즈)

 

데이터프레임 필터링 (새 데이터프레임 반)

titanic[titanic.sex == "male"]
titanic.loc[titanic.sex == "male"]
#동일한 결과 리턴

 

대괄호를 이용한 체인인덱싱 필터링 방식은 길어지면 많은 문제를 야기하므로 loc 메소드를 이용한 방식을 권장.

 

* 데이터 타입에 따른 열을 필터링 하는 방법

mask = titanic.dtypes == object #object형 추출
titanic.loc[:, ~mask] #타이타닉 데이터에서 object을 제외한 열 선택

 

 

* AND 조건으로 데이터프레임 필터링

mask1 = titanic.sex == "male"
mask2 = titanic.age > 14

#mask1과 mask2에 대한 행 필터링, [] 열 필터링 
male_surv = titanic.loc[mask1 & mask2, ["survived", "pclass", "sex", "age"]]

#데이터확인
male_surv.head()

 

 

*OR 조건으로 데이터프레임 필터링

mask1 = titanic.sex == "female"
mask2 = titanic.age < 14

#mask1 혹은 mask2 에 대한 행 필터링, [] 열 필터링
woman_surv = titanic.loc[mask1 | mask2, ["survived","pclass","sex","age"]]

#데이터확인
woman_surv.head()

 

 

* between() 메소드, isin() 메소드

정확한 데이터를 잘 모를때 범위지정에 좋음

data.Year.between(2001, 2024).head() #2001년 부터 2024년까지 year 데이터, boolean 시리즈로 리턴
new_data = data.loc[data.Year.between(2001, 2024, inclusive=True)] #경계값을 포함하는지 여부에 대한 파라미터

check = [2002, 2008]
data.Year.isin(check).head() #2002년, 2008년 해당되는지 확인, boolean 시리즈로 리턴
new_data = data.loc[data.Year.isin(check)] #2002년 혹은 2008년 데이터
new_data2 = data.loc[~data.Year.isin(check)] #2002년 2008년 제외 데이터

 

 

* any() 메소드, all() 메소드

any() : 주어진 축에서 하나의 값이라도 해당 조건이 있는지 확인, True False 리턴

all() : 모든 원소가 해당되는지를 확인, True False 리턴

(data.sex == "male").any() #True, 데이터에 남성이 하나라도 있음
(data.sex == "male").all() #False, 데이터에 여성이 하나라도 있음

#숫자 시리즈 데이터
#숫자 0은 False를 의미, 나머지 숫자는 True를 의미
pd.Series([-1, 0.5, 1, 0]).all() #해당 시리즈 데이터에 0이 아닌 값들만 있는지 확인, False 리턴
pd.Series([-1, 0.5, 1, 0]).any() #해당 시리즈 데이터에 0이 하나라도 있는지 확인, True 리턴

 

 

* 행, 열 삭제하기

<열>

drop() : column 파라미터를 이용해 지우고자 하는 열의 라벨을 입력

data.drop(columns = "Sport")
data.drop(columns=["Sport", "Age"], inplace=True) #원본 데이터프레임 변경사항 적용
data.drop(labels="Sport", axis="columns")

 

cf) loc 연산자를 이용해 열을 선택해서 저장하는 방법도 있음

data = data.loc[: , ["Year","City","Country","Medal"]]

 

많은 컬럼 중 몇개만 삭제하는거면 drop() 메소드 사용하고, 많은 컬럼 중 몇개만 사용하는거면 loc로 선택하는 방법이 편안할 듯 하다!

 

<행>

drop() : index 파라미터를 이용해 지우고자 하는 인덱스의 라벨을 입력

data.drop(index="David, Alfred")
data.drop(index = ["David, Alfred" , "Lane, Joe"] , inplace = True) #원본 데이터 변경
data.drop(labels="David, Alfred" , axis=0, inplace=True) #axis=0 혹은 axis="index"로 설정

 

cf) loc 연산자를 이용해 특정 조건의 행들로 이루어진 새 데이터 프레임 만들기

new_data = data.loc[data.Year == 2002] #년도가 2002년인 새 데이터

mask1 = data.Year == 2002
mask2 = data.Sport = "Baseball"
new_data = data.loc[~(mask1 | mask2)] #2002년도와 야구 데이터 제외한 새 데이터

#이후 2002년 데이터가 다 지워졌는지 확인하는 방법
(new_data.Year == 2002).value_counts() #False가 몇개인지 나오고 True는 없어야 됨
#Baseball 데이터가 다 지워졌는지 확인하는 방법
new_data.Sport.isin(["Baseball"]).any() #False 리턴
(new_data.Sport == "Baseball").any() #False 리턴

 

 

* 열 추가, 새로운 열 만들기

data["Zeros"] = 0 #원래 없는 열을 추가, 값은 모두 0으로 채움
data.Zeros = "zero" # .을 이용해 원래 있는 열에 값을 모두 바꿈

 

Pandas는 Numpy 배열과 마찬가지로 각 원소별 벡터화 연산이 가능한 장점이 있음.

반복문을 사용할 필요 없이 연산이 가능함.

원본 데이터 열을 이용해 새로운 데이터 열을 추가하기 용이.

# 1.타이타닉 침몰 년도에서 승객의 age를 빼서 승객의 출생연도 열 만들기
titanic["YoB"] = 1912 - titanic.age

# 2. 승객의 형재자매(sibsp)와 부모자식(parch) 수를 합쳐 직계가족수 열 만들기
titanic["relatives"] = titanic.sibsp + titanic.parch

# 3. 기존 열 삭제
titanic.drop(columns = ["sibsp" , "parch"] , inplace = True)

# 4. 티켓 값 물가상승률을 고려해 현재가격으로 열 만들기
titanic.fare = titanic.fare * 10 #10배 물가상승

 

 

insert() 메소드를 이용해 특정 인덱스 위치에 열 추가

data.insert(loc = 6, column = "relatives", value = relatives)
#loc=인덱스 위치 지정, column=삽입 열의 라벨, value=새 열의 값이 될 변수