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
- 날짜
- MySQL
- ASP
- mssql
- Excel
- IOS
- MS-SQL
- PyQt
- 리눅스
- sqlite
- 맛집
- urllib
- Linux
- port
- swift
- 다이어트
- tensorflow
- node.js
- flutter
- 함수
- PyQt5
- ubuntu
- javascript
- Unity
- pandas
- 유니티
- PER
- GIT
- 라즈베리파이
Archives
아미(아름다운미소)
그룹별 최신 유효값으로 결측값 채우기 본문
**✅ 기능**: 주어진 데이터프레임에서 지정한 그룹 컬럼 기준으로, **유효한 값이 있는 가장 최신 주차의 데이터**로 결측값을 채웁니다.
**🛡️ 안전성**: 최신 주차 값이 `NaN`이어도 그 다음 최신 유효값을 자동으로 찾아 처리합니다.
import pandas as pd
import numpy as np
# ------------------------------
# 1. 예제 데이터 생성
# ------------------------------
df = pd.DataFrame({
'a': ['x', 'x', 'x', 'x', 'y', 'y'], # 그룹 컬럼 1
'b': ['u', 'u', 'u', 'u', 'v', 'v'], # 그룹 컬럼 2
'c': ['p', 'p', 'p', 'p', 'q', 'q'], # 그룹 컬럼 3
'주차': [202410, 202411, 202412, 202413, 202411, 202412], # 시간 순서 컬럼
'd': [10, np.nan, 30, np.nan, np.nan, 60] # 결측값이 있는 타겟 컬럼
})
print("▶ 원본 데이터:")
print(df)
# ------------------------------
# 2. 결측값 채우기 함수 정의 (안전한 버전)
# ------------------------------
def fillna_with_latest_valid(df, group_cols, week_col, value_col):
"""
📚 기능: 각 그룹별로 유효한 값이 있는 가장 최신 주차의 데이터로 결측값을 채움
Parameters:
df (pd.DataFrame): 입력 데이터프레임
group_cols (list): 그룹화할 컬럼 리스트 (예: ['a','b','c'])
week_col (str): 시간 순서 컬럼 (예: '주차')
value_col (str): 결측값을 채울 타겟 컬럼 (예: 'd')
Returns:
pd.DataFrame: 결측값이 채워진 데이터프레임
"""
# STEP 1. 유효한 값만 필터링 → 주차 순 정렬 → 그룹별 최신 값 추출
latest_values = (
df.dropna(subset=[value_col]) # 결측값 행 제외
.sort_values(week_col) # 주차 오름차순 정렬
.groupby(group_cols, as_index=False)
.last() # 각 그룹의 마지막 행(최신 주차) 선택
[group_cols + [value_col]] # 필요한 컬럼만 추출
.rename(columns={value_col: 'latest_val'}) # 컬럼명 변경
)
# STEP 2. 원본 데이터와 병합 후 결측값 채우기
df_filled = (
df.merge(latest_values, on=group_cols, how='left') # 그룹 키로 병합
.assign(**{value_col: lambda x: x[value_col].fillna(x['latest_val'])}) # 결측값 채우기
.drop(columns='latest_val') # 임시 컬럼 제거
)
return df_filled
# ------------------------------
# 3. 함수 실행 및 결과 비교
# ------------------------------
# ✅ 안전한 버전 실행
df_result_safe = fillna_with_latest_valid(
df,
group_cols=['a', 'b', 'c'],
week_col='주차',
value_col='d'
)
print("\n▶ 안전한 버전 적용 결과:")
print(df_result_safe)
# ------------------------------
# 4. 기존 코드 vs 개선 코드 비교
# ------------------------------
# 🔥 주목할 점: (x,u,p) 그룹의 202411주차 결측값 처리 차이
print("\n🔍 비교 테이블 (기존 코드 vs 개선 코드):")
comparison = pd.DataFrame({
'원본_d': df['d'],
'기존코드결과': [10, np.nan, 30, 30, 60, 60], # 202411주차 NaN 유지
'개선코드결과': df_result_safe['d'] # 202411주차 10.0으로 채워짐
}, index=df['주차'])
print(comparison)
'랭귀지 > pandas' 카테고리의 다른 글
df a,b,c컬럼을 groupby 하고 df의 d컬럼의 최빈값을 취하고 동률일경우 min값을 가져옴 (0) | 2025.08.01 |
---|---|
pandas cross join (0) | 2025.08.01 |
dataframe 타입지정 (1) | 2025.07.30 |
컬럼 유무 및 NaN 검사를 고려한 안전한 최대값 추출 (0) | 2025.07.26 |
전체에 null이 하나라도 있으면 np.nan, 아니면 최대값 (1) | 2025.07.25 |
Comments