랭귀지/pandas

전체에 null이 하나라도 있으면 np.nan, 아니면 최대값

유키공 2025. 7. 25. 22:54

시작

# ❌ 잘못된 원래 코드 (에러 발생)
df['a'] = df1['a'].agg(lambda x: np.nan if x.isnull.any() else x.max()).reset_index(drop=True)

# "전체에 null이 하나라도 있으면 np.nan, 아니면 최대값"
# ✅ 올바르고 간결한 코드
df['a'] = np.nan if df1['a'].isnull().any() else df1['a'].max()
# 결론: 맞습니다! 이게 가장 pandas다운 깔끔한 코드입니다.
# 복잡한 agg() 체이닝 대신 조건부 표현식 + 자동 브로드캐스팅을 활용한 완벽한 해결책

🎯 결론 : 최종선택

if 'a' in df1.columns:
    # NaN이 아닌 값이 하나라도 있으면 최대값, 아니면 np.nan
    df['a'] = df1['a'].max() if df1['a'].notna().any() else np.nan
else:
    df['a'] = np.nan

 =========결론 최종선택까지 풀이과정==================================================

✅ "지금 구조가 실무적으로 합리적입니다."

너무 풀어서 복잡하게 쓸 필요도 없고,

너무 압축해서 읽기 어렵게 만들 필요도 없습니다.

✅ 장점

간결하고 한눈에 로직이 보임

컬럼 존재 여부 + NaN 체크까지 한 줄에 처리

⚠️ 단점

df1['a'].isnull().any()는 "하나라도 NaN이면 무조건 NaN 반환"

→ 즉, 값이 섞여 있어도 무시함

예: [1, 2, NaN]이면 결과는 np.nan (❌ 실무에서 손해날 수 있음)

# "전체에 null이 하나라도 있으면 np.nan, 아니면 최대값"
if 'a' in df1.columns:
    df['a'] = np.nan if df1['a'].isnull().any() else df1['a'].max()
else:
    df['a'] = np.nan

✅ 버전 1 — 간결한 3항 연산자 사용

✅ 장점

훨씬 정확하고 실무 친화적

df1['a'] = [NaN, NaN, 5] 같은 경우 → 5를 반환 (정상)

df1['a'] = [NaN, NaN, NaN] → np.nan (정상)

⚠️ 단점

코드가 약간 더 길어짐 (하지만 논리 분기상 더 명확)

if 'a' in df1.columns:
    if df1['a'].notna().any():  # NaN이 아닌 값이 하나라도 있을 때
        df['a'] = df1['a'].max()
    else:  # 모든 값이 NaN
        df['a'] = np.nan
else:  # 컬럼 자체 없음
    df['a'] = np.nan

 

if 'a' in df1.columns:
    if df1['a'].isnull().any():
        df['a'] = np.nan
    else:
        df['a'] = df1['a'].max()
else:
    df['a'] = np.nan
df['a'] = df1['a'].max() if 'a' in df1.columns and not df1['a'].isnull().any() else np.nan
df['a'] = df1['a'].max() if 'a' in df1 and not df1['a'].isnull().any() else np.nan
# 개발자가 헷갈린 부분들:1. agg() 사용법 오해
# 잘못된 이해: agg()가 각 행에 함수를 적용한다고 생각
df1['a'].agg(lambda x: ...)  # 실제로는 전체 시리즈에 한 번만 적용

# 실제 용도: 그룹별이나 다중 집계용
df.groupby('group')['a'].agg(lambda x: ...)  # 이게 맞는 용법2. reset_index(drop=True) 오남용# 스칼라 결과에 reset_index 적용 (의미없음)
single_value.reset_index(drop=True)  # 스칼라엔 인덱스가 없음

# 실제 용도: DataFrame/Series 인덱스 재설정용
df.reset_index(drop=True)  # 이게 맞는 용법3. 브로드캐스팅 개념 부족# 스칼라를 DataFrame 컬럼에 할당하는 올바른 방법을 몰랐음
df['a'] = single_value  # pandas가 자동으로 브로드캐스팅해줌
# 또는
df['a'] = np.full(len(df), single_value) 
# 명시적 방법아마 다른 언어나 라이브러리 경험에서 오는 혼동이거나, 
# pandas 메서드들의 정확한 동작 방식을 제대로 학습하지 않고 "되겠지" 하는 마음으로 조합한 것 같네요.
# 이런 실수는 pandas 초보자들에게 꽤 흔한 패턴입니다! 😅