길이 불일치
df['a'] = df1['a'].agg(lambda x: np.nan if x.isnull.any() else x.max()).reset_index(drop=True)
Colums must be same length as key 에러
원래 코드 `df['a'] = df1['a'].agg(...)`에서 발생한 에러는 `agg()`가 단일 값을 반환하기 때문에 `df['a']`의 길이와 맞지 않아서 발생한 문제
수정
import pandas as pd
import numpy as np
# 1. 예제 데이터 생성
df = pd.DataFrame({'other_col': [10, 20, 30]}) # 타겟 DataFrame (3행)
df1 = pd.DataFrame({'a': [1, np.nan, 3]}) # 소스 DataFrame (NaN 포함, 3행)
# 2. 조건에 따라 채울 값 계산
fill_value = np.nan if df1['a'].isnull().any() else df1['a'].max()
# 3. 전체 행에 동일 값 할당
df['a'] = np.full(len(df), fill_value)
# 4. 결과 출력
print("=== 최종 결과 ===")
print(df)
print("\n=== 검증 ===")
print(f"df['a'] 길이: {len(df['a'])}, df 행 개수: {len(df)}")
print(f"할당된 값: {fill_value}")
이 코드의 핵심 원리는
원래 코드에서 발생한 "Columns must be same length as key" 에러의 원인은 다음과 같습니다:
```python
df['a'] = df1['a'].agg(lambda x: np.nan if x.isnull.any() else x.max()).reset_index(drop=True)
```
이 코드의 문제점들:
1. **`agg()` 결과가 스칼라**: `agg()`는 전체 시리즈에 대해 하나의 집계값(스칼라)을 반환합니다
2. **`reset_index(drop=True)`의 무의미함**: 스칼라 값에는 인덱스가 없어서 이 메서드가 의미없습니다
3. **길이 불일치**: 스칼라 값을 DataFrame의 컬럼(여러 행)에 할당하려고 해서 길이가 맞지 않습니다
**수정된 코드의 장점:**
```python
# 조건부 값 계산 (명확하고 읽기 쉬움)
fill_value = np.nan if df1['a'].isnull().any() else df1['a'].max()
# 전체 행에 동일한 값으로 채우기
df['a'] = np.full(len(df), fill_value)
```
1. **명확한 로직**: 조건 확인과 값 할당을 분리
2. **효율적**: `np.full()`로 한 번에 모든 행을 같은 값으로 채움
3. **에러 없음**: 길이가 정확히 맞춰짐
이런 식으로 집계 결과를 DataFrame 전체에 브로드캐스팅할 때는 스칼라 값을 명시적으로 처리하는 것이 가장 안전하고 명확한 방법입니다.