아미(아름다운미소)

길이 불일치 본문

랭귀지/pandas

길이 불일치

유키공 2025. 7. 25. 16:33
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 전체에 브로드캐스팅할 때는 스칼라 값을 명시적으로 처리하는 것이 가장 안전하고 명확한 방법입니다.

Comments