qcoding

[데이터분석_정리_1]query() / sort_values() / assign() / groupby() / agg() / merge() / concat() 본문

Python 데이터분석

[데이터분석_정리_1]query() / sort_values() / assign() / groupby() / agg() / merge() / concat()

Qcoding 2022. 6. 21. 23:36
반응형

## 데이터 분석 명령어 정리

1) 조건에 맞는 데이터만 추출하기 --> query()

# 숫자일때
df.query( 'english<=80' )

# 문자일때 ""안에 글자 사용
df.query('category == "suv" ')

2) 여러조건 동시 충족 --> query , is in , in

#여러 조건 동시 충족 (and)
df.query( 'nclass == 1 & math >= 50')

#여러 조건 한개만 충족 (or)
df.query( 'nclass ==1 | math >=50' )
df.query( 'nclass in [1,3,5]' ) 
df.query('manufacturer in ["chevrolet","ford", "honda"]')


# np where 조건 이 여러개 일 때로 아래와 같이 사용할 때

mpg['size']=np.where( (mpg['category'] == 'campact') | 
                      (mpg['category'] == 'subcompact')
                    ,'small','large')
                    
                    
# isin()을 사용하여 아래와 같이 코드를 변경할 수 있음.

mpg['size']=np.where( mpg['category'].isin(['compact','subcompact']) , 'small' , 'large' )

3) 필요한 변수만 추출하기

#한 변수추출
df['math']
#여러 변수 추출
df[['math' , 'english']]
#변수제거
df.drop(colmns = 'math')
df.drop( columns = ['math' , 'english'] )

4) pandas 명령어 조합하기

df.query('math >=50')[['id','math']].head()

5) 순서대로 정렬하기

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

6) 여러 변수 기준 정렬

df.sort_values(['nclass','math'], ascending=[True,False])

7) 파생변수 추가하기

# 파생변수
df.assign(
  total=df['math'] + df['english']
)

8) assign()에 np.where() 적용하기

df.assign(
 test=np.where(df['science']>=60,'pass','fail')
)

9) 추가한 변수를 pandas 코드에 활용 및 lambda

#앞에서 사용한 변수추가 lambda 사용하기 
df.assign(
    sum_fe=lambda x:x['cty']+x['hwy'],
    avg_fe=lambda x:x['sum_fe']/2
).sort_values('avg_fe',ascending=False).head(3)

10) 집단별로 요약하기

--> agg() 와 사용되는 요약통계량 함수

함수 통계량 agg() 사용시
mean() 평균 mean
std() 표준편차 std
sum() 합계 sum
median() 중앙값 median
min() 최소값 min
max() 최대값 max
count() 빈도(개수) count
## 소수점 2째 자리서 반올림한다하면 끝에 round(2)를 붙여줌
df.groupby('nclass').agg(
  mean_math = ('math','mean')
).round(2)

## groupy by를 쓰면 groupby를 한 변수로 index가 되는데 이를 없애려면
as_index = False 를 사용하면된다.
df.groupby('nclass' , as_index=False)

10) 각집단별로 다시 집단 나누기

df.groupby(['manufacturer','drv']).agg(
  mean_cty=('cty','mean')
)

11) 데이터 합치기

## 가로로 합치기
pd.merge(test1, test2, how ='left' , on='id')

## 세로로 합치기
pd.concat([group_a, group_b] , ignore_index = True)

ignore_index = True 시 기존 index를 무시하고 새로 만든다.


* 세로로 합칠 때에는 변수의 이름이 같아야 된다.
같지않을 경우는 rename()을 사용한다.

df.rename(columns = {'기존':'변경이름','기존':'변경이름'},inplace=True)

12) 결측치 제거 --> 이상치를 결측치로 변경 np.where()

#이상치 처리
df['drv']=np.where(df['drv'].isin(['f','4','r']),df['drv'],np.nan)

#이상치 -> 결측치로 이상치 제거 확인
df['drv'].value_counts().sort_index()

13) 이상치제거 - IQR 방식

# 이상치 제거를 위해 qutile() 사용하기 IQR 을 통해 상/하한을 구함

# 1사분위 (0.25)
pct_25=df['cty'].quantile(0.25)
# 3사분위 (0.75)
pct_75=df['cty'].quantile(0.75)
print(f'1사분위 : {pct_25} , 3사분위 :{pct_75}')

#IQR 계산
iqr=pct_75-pct_25
print(f'iqr : {iqr}')

#상/하한 설정
upper=pct_75 + 1.5 * iqr
lower=pct_25 - 1.5 * iqr
print(f'상한 : {upper}, 하한 :{lower}')

#이상치 제거
df['cty']=np.where(
      (df['cty'] > 26.5 ) | (df['cty'] < 6.5),
     np.nan,
     df['cty'] 
)

#이상치제거확인
sns.boxplot(data=df,y='cty')

14) 이상치를 np.nan()으로 변경 후 --> dropna(subset=[]) 을 통해 np.nan 제거

# 결측치 제거 후 drv별로 cty 평균확인
df.dropna(subset=['drv', 'cty']).groupby('drv').agg(
    mean_cty=('cty','mean')
).sort_values('mean_cty',ascending=False)

*** 참고 np.where 입력 시 문자열과 np.nan을 같이 입력 시 실제 nan이 아닌 문자열 'nan'으로 읽히는 문제해결법

1) 결측치로 만들 값이 다른 문자부여

df['x2'].np.where(df['x1']==1 , 'a' , 'etc')

2) replace를 통해 np.nan으로 변경 후, dropna를 통해 제거

df['x2']=df['x2'].replace('etc',np.nan)

df.isna()로 nan 확인함
반응형
Comments