juooo1117

데이터 처리(조회,변환,집계,일괄처리,범주형) - pandas 본문

python

데이터 처리(조회,변환,집계,일괄처리,범주형) - pandas

Hyo__ni 2023. 10. 1. 21:13

원하는 조건을 데이터를 조회하고 일괄적으로 처리하는 방법에 대해 정리해 보자

 

1. 데이터 조회 - filter()

# 'Age'의 평균이 20이상이면 return!
def check_mean(data):
	return data['Age'].mean() >= 20

# 'Country' 별 'Age'의 평균이 20이상인 값 조회
df.groupyby('Country').filter(check_mean)
# 'col_name'과 'threshold'를 입력으로 받음
def check_mean2(data, col_name, threshold):
	return data[col_name].mean() >= threshold

df.groupby('Country').filter(check_mean2, col_name='Age', threshold=20)
# 조건에 해당하지 않으면 NaN으로해서 어쨌든 모두 출력!
df.groupby('Country').filter(lambda x : x['Age'].mean() >= 20)
# 'Country'별 'Age'의 최대/최소값 차이가 10이상 20미만인 'Country'는 어디?
def min_max_check(data):
	min_value = data['Age'].min()
    max_value = data['Age'].max()
    diff = max_value - min_value
    return diff >= 10 and diff < 20

result = df.groupby('Country').filter(min_max_check)
result['Country'].unique()

# 다른 방법
df.groupby('Country')['Age'].agg(['min','max', (lambda x : x.max() - x.min())])


2. 데이터 변환 - transform()

df2 = df.copy()
df2.groupby('Country')['Age'].transform('mean')  # 'Country'별 'Age'의 평균값으로 모두 변경 

# 'Country'별로 'Age'의 최대값에서 최소값을 빼서, 새롭게 생성한'min-max'column에 넣기
def min_max_diff(data):
	return data.max() - data.min()

df['min-max'] = df.groupby('Country')['Age'].transform(min_max_diff)

# 위와 동일한 결과!
df['min-max'] = df.groupby('Country')['Age'].transform(lambda x : x.max()-x.min())

 

3. 결측치 처리

df.dropna()  # 결측치가 있는 행(row)제거
df.dropna(axis=1)  # 결측치가 있는 열(column)제거

df.fillna(1000)  # 모든 결측치를 1000으로 대체
df.fillna({2:10000, 4:20000})  # index가 2,4 인 값들을 각각 변경!

# 동일한 순서로 결측치 채움 - 해당 순서의 값이 결측치가 아니라면 반영안됨!
replace_value([1000, 2000, 3000, 4000])
df.fillna(replace_value)  

# 'Age'의 해당 숫자번째 행들을 결측치로 만듦
df.loc[[0,2,5,6,7], 'Age'] = np.nan

 

4. 데이터 집계 - pivot_table()

# 'Country'별로 'Age'의 평균값을 조회
df.pivot_table(columns='Country', values='Age', aggfunc='mean')

# 2개의 column을 grouping해서 집계
# fill_value='0' : NaN값을 '0'으로 대체. margins=True : rollup(총합계 내줌)
df.pivot_table(index='Country', columns='Region',
		values='Age',
        	aggfunc='mean',
        	fill_value='0',
        	margins=True, margins_name='총계'
            	)
# 3개 이상의 컬럼을 grouping해서 집계
# 'Country'의 'Region'의 'Year'별로 ID세기
df.pivot_table(index=['Country', 'Region'],
		columns='Year',
    		values='ID',
    		aggfunc='sum',
    		margins=True
        	)

# 'Country'의 'Region'의 'Year'별로 'Age'의 최대/최소값
df.pivot_table(index=['Country', 'Region'],
		columns='Year',
    		values='Age',
    		aggfunc=['min','max']
    		)

 

5. 데이터 일괄처리 - apply()

df.WEEKDAY.value_counts().sort_index()

# 원소 하나씩 받아서 처리
def change_weekday(value):
	 l = list("월화수목금토일")
   	 v = l[value-1]
    	return (v + "요일")

df['WEEKDAY'] = df['WEEKDAY'].apply(change_weekday)

 

6. 데이터를 범주형으로 변환

  • pd.cut(x, bins, right=True, labels=None) : 지정한 값을 기준(bins)으로 구간을 나눠 그룹으로 묶음
  • pd.qcut(x, q, labels) = 대상의 최대~최소값을 지정한 개수(q)로 동등한 원소개수로 나눔
# 'Age'컬럼을 3그룹으로 나눔. 분위값은 왼쪽그룹에 포함시킴.
result = pd.cut(df['Age'], bins=3, right=False, labels=['청년','중년','노년'])
result.value_counts()

# 원하는 범위(기준)로 그룹 나누기
## 0~20, 21~40, 41~60, 61~100
l = [0, 20, 40, 60, 100]
result = pd.cut(df['Age'], bins=l, labels=['청소년','청년','장년','노년'])
result.value_counts().sort_index()
# 각 그룹에 동일한 원소가 되도록 그룹 나누기
result = pd.qcut(df['Age'], q=4, labels=['A','B','C','D'])
result = value_counts()