일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- MySQL
- port
- GIT
- 유니티
- mssql
- PER
- pandas
- Excel
- Unity
- PyQt5
- 다이어트
- 리눅스
- swift
- IOS
- 맛집
- ASP
- python
- sqlite
- flutter
- Linux
- node.js
- ubuntu
- PyQt
- 라즈베리파이
- 날짜
- 함수
- javascript
- MS-SQL
- tensorflow
- urllib
아미(아름다운미소)
길이 불일치 본문
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 전체에 브로드캐스팅할 때는 스칼라 값을 명시적으로 처리하는 것이 가장 안전하고 명확한 방법입니다.
'랭귀지 > pandas' 카테고리의 다른 글
컬럼 유무 및 NaN 검사를 고려한 안전한 최대값 추출 (0) | 2025.07.26 |
---|---|
전체에 null이 하나라도 있으면 np.nan, 아니면 최대값 (1) | 2025.07.25 |
카테고리타입 (1) | 2025.07.25 |
Python으로 CSV → DuckDB 저장 (0) | 2025.07.16 |
None type replace (0) | 2025.06.23 |