본문 바로가기

빅데이터분석기사_실기/기초

조건에 맞는 데이터 추출하기!

 

import pandas as pd

file_path = 'content/drive/MyDrive/data/titanic_train.csv'
df = pd.read_csv(file_path)

df #확인해보기

자 먼저 판다스 피디로 임포트 해주고

파일경로 따로 변수에 저장해서 read_csv 함수 이용해서 titanic_train.csv 파일 불러와줍니다.

df


행(row) 조회

  • 하나의 행 조회: 데이터프레임명[조회 할 인덱스:인덱스+1]
  • 여러 개의 행 조회: 데이터프레임명[조회 할 시작인덱스:끝인덱스+1]
df[:10]

인덱스 0(처음 행)부터 인덱스 9까지 총 10개의 행 조회

결과


df[3:7]

인덱스 3부터 인덱스 6까지 총 4개의 행 조회

결과


df[3:4]

인덱스 3번 행 한 개만 조회

결과


열(column) 조회

  • 하나의 열 조회: 데이터프레임['컬럼명'] / 데이터프레임.컬럼명
  • 여러 개의 열 조회: 데이터프레임[['컬럼명1', '컬럼명2', ...]]

 

df['Survived']
df.Survived

df의 Survived 컬럼을 조회하는 두 가지 방법

결과

 


df['Survived'].to_frame()

데이터프레임의 형태로 조회하고 싶을 때 쓰는 함수인 .to_frame()

df[['Survived']]

.to_frame() 대신에 리스트로 묶으면 마찬가지로 데이터프레임 형태로 조회할 수 있다.

결과


df[['Survived','Pclass','Name']]

여러개의 컬럼을 데이터프레임 형태로 조회하고 싶을 때는 이렇게~

df에서 survived, pclass, name 컬럼만을 조회하기..

데이터를 불러올 때 애초에 pd.read_csv 에서 use_cols 인자를 사용하여 

원하는 컬럼만 불러오는 방법과 다른 점은.. 애초에 불러올 때는 필요한것 외 다른 컬럼들도 불러왔었다는 것.

텍스트로 정리를 왤케 못하지???ㄷㄷㄷ 작문능력을 키워야겠어요

결과


loc, iloc 사용하기

loc: 레이블'값'을 사용하여 조회

  • 데이터프레임명.loc[행조건,열조건]
  • 열조건만 입력하고 싶으면(열만 조회할때) 행조건에 : 입력 , 데이터프레임명.loc[:,열조건]
df.loc[3,]

행조건만 입력한 경우: 인덱스 3번 행이 출력됨

결과


df.loc[:,'Name']

열조건만 입력한 경우: Name 컬럼만 출력됨

결과


df.loc[3,'Name']

행조건과 열조건 모두 입력한 경우: 인덱스 3 행에서 Name 컬럼만 출력됨

결과


df.loc[3:5,]

행조건만 입력한 경우: 3번부터 5번행까지 조회

**왜 5번(끝인덱스)이 포함되는가?

loc은 레이블"값"을 이용해 조회하는 것이기 때문!!**

(iloc은 위치인덱스 사용)

문자열 인덱스 사용 시 끝인덱스가 포함되는 경우와 같은 것!

결과


df.loc[3:5,['Age','Pclass']

행조건과 열조건 모두 입력한 경우: 3,4,5번 인덱스 행들에서 age와 pclass 컬럼들만을 조회

결과


df.loc[[1,3,5],['Age','Pclass']]

행조건 입력 시 범위 설정도 가능하지만 이렇게 특정 행들을 리스트로 묶어 조회할 수도 있음

결과


df1 = df.set_index('Name')
df1.head() #확인해보기

Name 컬럼을 인덱스로 설정 -> 문자열인덱스가 생성됨

결과

df1.loc['Heikkien, Miss. Lina']

문자열 인덱스가 생성된 경우, loc 함수는 이처럼 인덱스 '값' (위치인덱스 안됨)을 넣어야 한다.

df1.loc[['Heikkien, Miss. Laina', 'Allen, Mr. William Henry'],]

여러 행 보려면 이렇게 리스트로 묶어서..

df1.loc[3:5,]

**이렇게 하면 오류: loc은 위치인덱스가 아닌, 레이블값!!을 이용하기 때문** 반복학습~~


iloc: 위치인덱스 사용하여 조회

  • 데이터프레임명.iloc[행인덱스조건,열인덱스조건]
  • 열조건만 입력하고 싶으면(열만 조회할때) 행조건에 : 입력 , 데이터프레임명.iloc[:,열인덱스조건]
df1.iloc[3,]

iloc은 위치인덱스 사용: 인덱스 3번 행을 조회

df1.iloc[:,5]

iloc은 위치인덱스 사용: 인덱스 5번 열을 조회


df.iloc[3:7,]

인덱스 3번부터 6번까지 총 4개의 행 조회

loc과 달리 iloc은 위치인덱스를 사용하기 때문에 끝인덱스는 포함되지 않는다.

결과


df1.iloc[3:5,2:4]

3,4 위치인덱스 행들의 2,3 위치 인덱스 컬럼들만을 조회

문자열 인덱스가 설정되어 있지만 no 상관 어차피 위치인덱스쓰니까 

결과


데이터 정렬하기

  • 데이터프레임명.sort_values('정렬기준컬럼명')
  • 디폴트는 오름차순(ascending=True), 내림차순으로 하고 싶으면 (ascending=False) 옵션 명시
df.sort_values('Age')

나이를 기준으로 오름차순 정렬됨

df.sort_values('Age',ascending=False)

나이를 기준으로 내림차순 정렬됨

df.sort_values(['Age','Fare'], ascending=[False,True])

기본적으로 Age를 기준으로 내림차순 정렬이 되는데, 

Age가 같은 행들은 Fare를 기준으로 오름차순 정렬됨 

결과


특정 조건을 충족하는 데이터 추출

  • 형식1: 데이터프레임명[조건식]
  • 형식2: 데이터프레임명.query('조건식')
df[df['Pclass']==1]

형식1: 데이터프레임명[조건식]

df에서 Pclass 값이 1인 행들만 추출하기

df.query('Pclass == 1')

형식2: 데이터프레임명.query('조건식')

위와 마찬가지로 df에서 Pclass 값이 1인 행들만 추출하기

**조건식이 꼭 문자열로 표현되어야 함**


 

df[(df['Pclass']==1) & (df['Age']>=30)]
df.query('Pclass == 1 and Age >= 30')

df에서 Pclass가 1이면서 Age가 30 이상인 행들만 추출하기

**형식1에서 여러개 조건 명시하고 싶으면 대괄호 안에 괄호() 이용해서 조건문들 구분**

df[(df['Pclass'] == 1) | (df['Age'] >= 30)]
df.query('Pclass == 1 or Age >= 30')

df에서 Pclass가 1이거나 Age가 30이상인 행들 추출하기


 

df[df['PassengerId'].isin([3,100,50])]
df.query('PassengerId in [3,100,50]')
df.query('PassengerId.isin([3,100,50])')

df에서 PassengerId가 3,100,50 중에 있다면 그 행들을 보여줘

결과


import random

passengerid_list = list(df['PassengerId'])
#df의 PassengerId 컬럼의 값들을 전부 passengerid_list 이름의 리스트에 저장

passengerid_sample = random.sample(passengerid_list, 10)
#random.sample 함수를 이용해서 passengerid_list에 있는 값들 중 10개를 랜덤으로 뽑아서
#passengerid_sample 이름의 리스트에 저장함

df.query('PassengerId in @passengerid_sample')
#passengerid_sample 리스트에 뽑힌 passengerId를 가진 행들을 조회

**query 함수에서 문자열로 조건식을 쓸 때,

변수를 사용하려면 변수명이라는 것을 명시하기 위해 변수명 앞에 @ 사용**