자신에게 친절할 것 :)

Data Science/Pandas

[Pandas] 인덱싱 indexing, 슬라이싱 slicing, 필터링 filtering

Tashapark 2024. 5. 26. 21:44
728x90

#코드잇 데이터 사이언스 강의 듣는 중

 

이거 또 왜이러냐 ..

하.. 

갑자기 파일의 저장 경로를 못 찾겠다고 하면 그 위에 것까지 넣어보고, 

그냥.. 상위 폴더를 의미하는 '../ '를 추가하면 됨..

근데 이것도 될 때가 있고 안 될 때가 있는데 나도.. 모르겠음.. 🤷‍♀️🤦‍♀️

컴퓨터는 왜 깔끔한 거 같으면서도 가끔 인간같이 지멋대로임...

import pandas as pd
iphone_df = pd.read_csv('../data/iphone.csv', index_col = 0)
iphone_df

 

 

기본적으로 .loc['로', '벡터' ]를 지정하면 해당 값을 가져 올 수 있음. 

로 전체를 가져오고 싶다면 벡터 위치에 : 를 넣으면 됨. 

벡터도 마찬가지임.

간략하게 쓰는 법은 로랑 벡터가 조금 다름. 

로는 .loc['로']

벡터는 ['벡터']

iphone_df.loc['iPhone 8', '메모리']

iphone_df.loc['iPhone X', :]
#iphone_df.loc['iPhone X'] 위랑 같음

type(iphone_df.loc['iPhone X'])
#pandas.core.series.Series

iphone_df.loc[:,'출시일']
#iphone_df['출시일']

type(iphone_df['출시일'])
#pandas.core.series.Series

 

- 타입은 모두 시리즈임. 한 로 or 벡터를 뽑은 것이기 때문에 일차원이니까. 

 

- 여러 개를 가지고 오려면, []를 한 번 더 해주면 됨

#1개
df[column]

#여러 개
df[[column1, column2]]

#df[['SBS','JTBC']]

 

- 다른 df에서 필요한 벡터만 가지고 와서 df 만들기

import pandas as pd

samsong_df = pd.read_csv('data/samsong.csv')
hyundee_df = pd.read_csv('data/hyundee.csv')


day = samsong_df['요일']
samsong = samsong_df['문화생활비']
hyundee = hyundee_df['문화생활비']

culture_fee = {
    'day' : day,
    'samsong' : samsong,
    'hyundee' : hyundee
}

culture_fee_df = pd.DataFrame(culture_fee)

culture_fee_df

# 더 간단하게 하면 이렇게 합쳐서 바로 쓸 수 있음.
# combined_df = pd.DataFrame({
#     'day': samsong_df['요일'], 
#     'samsong': samsong_df['문화생활비'], 
#     'hyundee': hyundee_df['문화생활비']
# })
# combined_df

 

- 여러 행, 열 가져 올 때 

#행
iphone_df.loc[['iPhone X','iPhone 8']]

#열
iphone_df[['Face ID', '출시일', '메모리']]

 

 

 

 

- 슬라이싱도 기본적으로 비슷함. 

- 다만 인덱싱이랑 반대로 이번에는 벡터가 다소 복잡함. 

(그렇다기 보단, 로를 반드시 표기해야 함. )

- 로 --> .loc['':'']

- 벡터 --> .loc[:, '': ''] 

#로
iphone_df.loc['iPhone 8':'iPhone XS']
iphone_df.loc[:'iPhone XS']

#벡터
iphone_df.loc[:,'메모리':'Face ID']
iphone_df.loc['iPhone 7':'iPhone X','메모리':'Face ID']

 

- 넘파이처럼 불린 값으로도 필터링이 가능함. 

- 둘 다 길이를 맞춰서 넣어줘야함.

예. 이 7개니깐 7개, 열은 5개라 5개. 

#행
iphone_df.loc[[True, False, True, True, False, True, False]]

#열
iphone_df.loc[:, [True, False, True, True, False]]

 

but, 이런 식으로 불린 값을 일일히 확인하지 않고, 1) 대개 조건식으로 확인함. 

- 넘파이랑 같음 --> True 인 값들만 나타남. 

- 동시에 여러 조건 충족은 () & | () --> 괄호 사이에 연산식을 넣어 주면 됨. 

 

iphone_df.loc[iphone_df['디스플레이'] > 5]

iphone_df.loc[iphone_df['Face ID'] == 'Yes']


#동시에 만족하려면 () & ()
#너무 기니깐 변수에 입력해줌 
condition = (iphone_df['디스플레이'] > 5) & (iphone_df['Face ID'] == 'Yes')
iphone_df[condition]

 

++ 튜플이랑 리스트랑 섞어서 사용하는데.. 

- 여전히 명확하게는 모르겠으나, []로 바꿨을 때는 unsupported operand typeError가 떠서 아마도 수식이 변화하지 않는 것이니 상수처리로 보는 것이 아닐가 생각한다. 

- 튜플과 리스트의 가장 큰 차이점은 가변성이고 튜플은 불변이고, 그렇기 때문에 가볍고 성능이 빠르기 때문으로 여겨짐. 

 

- 2) 조건 식이 들어간 벡터만 가지고 올 때 주의할 것. 

- 그냥 df[condition]으로만 하다가 KBS 만 뜨는 게 아니라 해당 로가 다 떠서.. 뭐지 하면서 고민했음. 

- row는 컨디션 중에서, 벡터는 'KBS'만 ==> 쪼개 서 생각할 것. 

 

import pandas as pd

# 데이터 불러오기
df = pd.read_csv('data/broadcast.csv', index_col=0)

# 조건 설정
condition = df['KBS'] > 30

# 조건에 맞는 벡터 반환
df.loc[condition, 'KBS']


#벡터 여러 개인 경우 응용

df = pd.read_csv('data/broadcast.csv', index_col=0)
condition = df['SBS'] < df['TV CHOSUN']

df.loc[condition, ['SBS', 'TV CHOSUN']]

 

+++ 3) 조건을 부여해서 새로운 벡터로 불린 값을 넣어주는 것. 

위의 1) 값 자체를 바꿔주는 것이고, 2) 이미 있는 열에서 codition에 해당하는 값을 가져오는 것. 

- condition 자체를 부여하는 것이지 df[condition]이 아님

import pandas as pd
    
df = pd.read_csv('data/toeic.csv')

condition = (df['LC'] >= 250) & (df['RC'] >= 250) & ((df['LC'] + df['RC']) >= 600)
df['합격 여부'] = condition

#쪼개면 가독성은 더 올라감. 
#pass_total = df['LC'] + df['RC'] >= 600
#pass_both = (df['LC'] >= 250) & (df['RC'] >= 250)
#df['합격 여부'] = pass_total & pass_both


df

 

 

4) 응용해서 여러 값 수정 예시

- 값을 들여다 보면서 공통 특징을 찾아낼 것 . 최대한 쉬운 방향으로 고민할 것. 

- 특히 슬라이싱이 복잡해 보여도 단계별로 하면 되니깐. 

- 컨디션을 잘 고민해 볼 것.

import pandas as pd

df = pd.read_csv('data/Puzzle_before.csv')

df['A'] = df['A'] *2

# df.loc[:, 'B':'E'] = (df.loc[:, 'B':'E'] >= 80).astype(int)
df[df.loc[:, 'B':'E'] < 80] = 0
df[df.loc[:, 'B':'E'] >= 80] = 1

df.iloc[2, 5] = 99
# df.loc[2, 'F'] = 99

 
df

 

 

 

- pandas도 numpy처럼 인덱스 번호로 불러올 수 있음.

- .iloc를 붙여주면 됨 (강사님이 아마 integer location일 것으로 추측하심)

iphone_df.iloc[2,4]

#해당 값들 여러 개 가능
iphone_df.iloc[[1,3],[1,4]]

#슬라이싱도 가능
iphone_df.iloc[3:, 1:4]

 

728x90
반응형