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 확인함
반응형