[데분스] Day+10(1). Python - Getting & Knowing Data, Filtering & Sorting, Grouping, Apply, Map

용솝·2024년 3월 6일

Python

목록 보기
1/3
post-thumbnail

파이썬 데이터 핸들링 기본

1. Getting & Knowing Data

# 상위 5개 행 출력
df.head()

# 데이터 행,열 갯수 파악
print(df.shape) # >> (51490, 61)

# 전체 컬럼 출력
df.columns

# 6번째 컬럼 출력
# (0부터 인덱스 시작함!)
df.columns[5]

# 6번째 컬럼의 데이터 타입 확인
# iloc - 행, 열에 인덱스 번호로 접근(loc - 레이블 이름으로 접근)
df.iloc[:,5].dtype # >> dtype('int64')

# 데이터셋의 인덱스 구성 확인
df.index # >> RangeIndex(start=0, stop=51490, step=1) : 0부터 51489까지, 1씩 증가

# 6번째 컬럼의 3번째 값(3행, 6열)
df.iloc[2,5] # >> 2

# 한글 인코딩으로 데이터 로드
df = pd.read_csv(DriveUrl, encoding = 'euc-kr')

# 데이터 마지막 3개행 출력
df.tail(3)

# 수치형 변수(numerical)를 가진 컬럼 출력
df.select_dtypes(exclude=object).column 
# exclude=object - object형 제외한 컬럼들(int, float 등)

# 범주형 변수를 가진 컬럼 출력
df.select_dtypes(include=object).column 

# 각 컬럼의 결측치 숫자 파악
df.isnull().sum()

# 각 컬럼의 데이터수, 데이터타입 확인
df.info()

# 각 수치형 변수의 분포(사분위, 평균, 표준편차, 최대, 최소) 확인
df.describe()

# 거주인구 컬럼 값 출력
df['거주인구']

# 평균속도 컬럼의 4분위 범위(IQR) 값
df['평균속도'].quantile(0.75) - df['평균속도'].qunatile(0.25)
# IQR = 3분위수 - 1분위수
# >> 14.854999999999997

# 읍면동명 컬럼의 유일값(unique) 갯수(n) 출력
df['읍면동명'].nunique() # >> 41

# 읍면동명 컬럼의 유일값 출력
df['읍면동명'].unique()

2. Filtering & Sorting

# reset_index(drop=True) - 인덱스 0부터 재정렬
df.loc[df['quantity']==3].head().reset_index(drop=True)

# 다중 컬럼은 [리스트] 형태로 넣어주기
df2 = df[['quantity','item_price']]

# str[n:m] - 'n'번째부터 'm-1'까지의 문자 떼어오기
df['item_price'].str[1:].astype('float')

# 다중 조건은 (소괄호)로 각각 묶어주기
df[(df.new_price <=9) & (df.item_name == 'Chicken Salad Bowl')].head()

# srot_values('컬럼명') - 컬럼명에 따라 오름차순(asc)
df.sort_values('new_price').reset_index(drop=True).head()

# str.contains('문자열') - 문자열을 포함하는 경우
df.loc[df.item_name.str.contains('Chips')].head()

# iloc[:,::2] - 행 전체, 열은 step 2칸씩
df.iloc[:,::2]

# sort_values('컬럼명', ascending=False) - 내림차순(기본 오름차순)
df.sort_values('new_proce', ascending=False).reset_index(drop=True)

# drop_duplicates('컬럼명') - 컬럼명 기준으로 첫번째 케이스만 남기고 중복행 제거
# drop_duplicates('컬럼명',keep='last') - 컬럼명 기준으로 마지막 케이스만 남기고 중복행 제거
df.loc[(df.item_name == 'Steak Salad') | (df.item_name == 'Bowl')].drop_duplicates('item_name

# mean() - 평균값
df.loc[df.new_price >= df.new_price.mean()]

# loc[행, 열] - 행과 열 기준으로 조건을 걸기 위한 loc
df.loc[df.item_name =='Izze','item_name'] = 'Fizzy Lizzy'

# ~ - 반대 경우
df.loc[~df.choice_description.str.contains('Vegetables')]

# str.startswith('문자') - 문자로 시작하는 경우 
df[df.item_name.str.startswith('N')]

# insin(리스트) - 리스트에 있는 값이 있는 경우
df.loc[df.new_price.isin(lst)]

3. Grouping

# value_counts() - 유일값 갯수 측정(null 제외하고 계산), 기본 내림차순 정렬
df.host_name.value_counts().sort_index()

# groupby() - 여러조건은 [리스트]에 넣어서
# size() - null 값까지 측정
df.groupby(['neighbourhood_group','neighbourhood'], as_index=False).size()

# agg() - 평균, 분산, 최대, 최소 등 함수계산열 추가
df.groupby('neighbourhood_group')['price'].agg(['mean','var','max','min'])

# unstack() - 계층적 indexing 없이 표현(pivot처럼)
# fillna() - nan 값을 해당 값으로 채우기
df.groupby(['neighbourhood','neighbourhood_group']).price.mean().unstack().fillna(-999)

# reshape(-1,1) - 값을 1차원 배열로 만듦
Ans.loc[:,:] = (Ans.values / Ans.sum(axis=1).values.reshape(-1,1))

4. Apply, Map

map은 'Series'만, Apply는 Series, Data Frame 모두 적용 가능

# dic - {'키' : 값} 으로 이루어진 딕셔너리
# map - 주로 딕셔너리를 컬럼에 적용할 때
# lambda - 사용자 정의 함수. 앞에 나온 Income_Category 값을 x로 취급
dic = {
    'Unknown'        : 'N',
    'Less than $40K' : 'a',
    '$40K - $60K'    : 'b',
    '$60K - $80K'    : 'c',
    '$80K - $120K'   : 'd',
    '$120K +'        : 'e'
}
df['newIncome'] = df.Income_Category.map(lambda x: dic[x])

# apply(사용자 정의 함수) - 주로 사용자 정의 함수를 컬럼에 적용할 때
def changeCategory(x):
    if x =='Unknown':
        return 'N'
    elif x =='Less than $40K':
        return 'a'
    elif x =='$40K - $60K':
        return 'b'
    elif x =='$60K - $80K':
        return 'c'
    elif x =='$80K - $120K':
        return 'd'
    elif x =='$120K +' :
        return 'e'
df['newIncome']  =df.Income_Category.apply(changeCategory)

# 1, 조건이면, 아니면 0
df.Education_Level.map(lambda x: 1 if 'Graduate' in x else 0).value_counts
# numpy 로도 동일한 기능 구현
np.where( df.Education_Level.str.contains('Graduate'), 1, 0)

profile
🖐

0개의 댓글