Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Python
- AI 윤리
- TFX
- RNN
- gaze estimation
- LSTM
- VGGNet
- Logistic Regression
- Ann
- Generative model
- MLOps
- BERT
- stemming
- Clustering
- 경사하강법
- SOMs
- Binary classification
- textmining
- Transfer Learning
- ResNet
- NER
- Support Vector Machine
- tensorflow
- Attention
- nlp
- NMF
- 자기조직화지도
- Gradient Descent
- cross domain
- 군집화
Archives
- Today
- Total
juooo1117
데이터 처리(조회,변환,집계,일괄처리,범주형) - pandas 본문
원하는 조건을 데이터를 조회하고 일괄적으로 처리하는 방법에 대해 정리해 보자
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()
'python' 카테고리의 다른 글
데이터프레임 합치기 - pandas (0) | 2023.10.01 |
---|---|
데이터 정렬 & 집계 - pandas (0) | 2023.09.29 |
데이터 불러오기 & 조회 및 변경 - pandas (0) | 2023.09.29 |
Comprehension (0) | 2023.08.17 |
if문, while문, for in문(range, enumerate, zip), continue, break (0) | 2023.08.16 |