fork download
  1.  
Success #stdin #stdout 0.04s 9408KB
stdin
import pandas as pd
import numpy as np

# 1. 파일 읽기
df = pd.read_csv('_fe987bfb70ac4bbab51cb3c5c99bd706_sales_transactions_jr.csv')

# 2. quantity 열 처리: 숫자로 변환 가능한 값만 변환, 그 외는 NaN
df['quantity'] = pd.to_numeric(df['quantity'], errors='coerce')

# 3. unit_price 열 처리
def clean_unit_price(price):
    if isinstance(price, str):
        # $ 기호 제거
        price = price.replace('$', '').strip()
        # "Ten" 같은 텍스트는 NaN으로 처리
        if price.lower() == 'ten':
            return np.nan
        try:
            return float(price)
        except:
            return np.nan
    else:
        try:
            return float(price)
        except:
            return np.nan

df['unit_price'] = df['unit_price'].apply(clean_unit_price)

# 4. quantity 결측값을 중앙값으로 대체
quantity_median = df['quantity'].median()
df['quantity'] = df['quantity'].fillna(quantity_median)

# 5. unit_price 결측값을 평균으로 대체
unit_price_mean = df['unit_price'].mean()
df['unit_price'] = df['unit_price'].fillna(unit_price_mean)

# 6. total_price 재계산 (quantity * unit_price)
df['total_price'] = df['quantity'] * df['unit_price']

# 7. order_date_missing 플래그 생성
df['order_date_missing'] = df['order_date'].apply(
    lambda x: 1 if pd.isna(x) or (isinstance(x, str) and str(x).strip() == '') else 0
)

# 8. customer_email_missing 플래그 생성
def is_missing_email(email):
    if pd.isna(email):
        return 1
    email_str = str(email).strip()
    if email_str == '':
        return 1
    return 0

df['customer_email_missing'] = df['customer_email'].apply(is_missing_email)

# 9. 결과 저장
df.to_csv('sales_transactions_jr_clean_missing.csv', index=False)

# 10. 처리 결과 출력
print("=" * 80)
print("sales_transactions_jr_clean_missing.csv 파일이 생성되었습니다!")
print("=" * 80)

print(f"\n데이터 형태: {df.shape[0]}행 × {df.shape[1]}열")
print(f"\n처리된 열별 정보:")

# 수치형 열 통계
numeric_cols = ['quantity', 'unit_price', 'total_price']
for col in numeric_cols:
    if col in df.columns:
        print(f"\n{col}:")
        print(f"  - 최소값: {df[col].min():.2f}")
        print(f"  - 최대값: {df[col].max():.2f}")
        print(f"  - 평균값: {df[col].mean():.2f}")
        if col == 'quantity':
            print(f"  - 중앙값: {df[col].median():.2f}")
        if col == 'unit_price':
            print(f"  - 사용된 평균값: {unit_price_mean:.2f}")

print(f"\n플래그 열 통계:")
print(f"  - order_date_missing (1인 경우): {df['order_date_missing'].sum()}개")
print(f"  - customer_email_missing (1인 경우): {df['customer_email_missing'].sum()}개")

# 결측값 처리 전후 비교
print(f"\nquantity 결측값 처리:")
print(f"  - 원본 결측값 수: {pd.read_csv('_fe987bfb70ac4bbab51cb3c5c99bd706_sales_transactions_jr.csv')['quantity'].isna().sum()}")
print(f"  - 처리 후 결측값 수: {df['quantity'].isna().sum()}")
print(f"  - 사용된 중앙값: {quantity_median:.2f}")

print(f"\nunit_price 결측값 처리:")
original_unit_price = pd.read_csv('_fe987bfb70ac4bbab51cb3c5c99bd706_sales_transactions_jr.csv')['unit_price']
# 원본에서 비숫자 값 개수 확인
non_numeric_count = original_unit_price.apply(lambda x: not (isinstance(x, (int, float)) or (isinstance(x, str) and x.replace('$', '').replace('.', '').isdigit()))).sum()
print(f"  - 원본 비숫자 값 수: {non_numeric_count}")
print(f"  - 처리 후 결측값 수: {df['unit_price'].isna().sum()}")
print(f"  - 사용된 평균값: {unit_price_mean:.2f}")

print("\n처리된 데이터 샘플 (처음 10행):")
print(df.head(10).to_string())

print(f"\n파일 경로: sales_transactions_jr_clean_missing.csv")
print("=" * 80)
stdout
Standard output is empty