작성
·
595
0
다르게 적용해보는 Feature Engineering1
5:50
df_all['Age'] = df_all.groupby(['Title', 'Pclass'])['Age'].apply(lambda x: x.fillna(x.median()))
에서 아래와 같은 에러가 뜹니다.
11613 if not value.index.is_unique:
11614 # duplicate axis
11615 raise err
11616
> 11617 raise TypeError(
11618 "incompatible index of inserted column with frame index"
11619 ) from err
11620 return reindexed_value
TypeError: incompatible index of inserted column with frame index
이전 챕터에서
df_all["Age"].fillna(df_all.groupby(['Title', 'Pclass'])["Age"].transform("median"), inplace=True)
위와 같은 진행했었던 기억이 있는데 비슷한 맥락이 맞나요?
아직 모르는게 많아서 강의자료에서 에러가 뜨면 턱턱 막히네요.... 😢
답변 1
0
안녕하세요. 답변 도우미입니다.
우선 전체 강의자료는 그대로만 순차적으로 실행하시면 에러가 뜨지 않거든요. 아마 중간에 실행 순서를 달리 하셨거나, 임의 코드를 넣어서 실행을 하시면서 에러가 나신 것으로 이해가 됩니다. 그렇다면, 아예 새로 강의 자료를 다운받으셔서 영상과 함께 테스트해보시면 에러도 나지 않고, 당황하지 않으실꺼예요~~
위 문의와 관련해서 보다 상세히 설명드리면, 맞습니다. 두 코드 조각은 모두 Age
컬럼에 있는 결측치를 Title
과 Pclass
를 기준으로 그룹화한 후, 해당 그룹의 Age
컬럼의 중앙값으로 채우는 방법을 시도하고 있어요.
첫 번째 코드는 groupby
와 apply
를 사용하는데, 이 때 apply
함수 내에서 사용된 lambda
함수를 통해 각 그룹에 대해 fillna
를 호출하고 있습니다. x
는 각 그룹의 Age
컬럼을 나타내며, x.median()
은 그 그룹의 중앙값을 계산합니다.
df_all['Age'] = df_all.groupby(['Title', 'Pclass'])['Age'].apply(lambda x: x.fillna(x.median()))
두 번째 코드는 fillna
를 직접 호출하지 않고, groupby
와 transform
을 통해 같은 작업을 수행하는 코드입니다. transform("median")
은 각 그룹의 중앙값을 계산하고, 이를 fillna
의 인자로 넘겨줍니다. inplace=True
파라미터는 df_all
의 Age
컬럼을 직접 수정합니다.
df_all["Age"].fillna(df_all.groupby(['Title', 'Pclass'])["Age"].transform("median"), inplace=True)
에러 메시지 TypeError: incompatible index of inserted column with frame index
는 첫 번째 코드에서 df_all['Age']
에 새로운 값들을 할당하려 할 때, 반환된 시리즈의 인덱스와 df_all
의 인덱스가 일치하지 않을 때 발생합니다. 이는 apply
함수가 반환한 결과가 원래 데이터프레임과 다른 인덱스를 가지고 있을 때 발생할 수 있습니다.
이 문제를 해결하기 위해 두 번째 코드처럼 transform
을 사용하는 것이 더 안정적인 방법일 수 있습니다. transform
은 원본 데이터프레임의 인덱스를 유지한 채로 결과를 반환하므로 이런 종류의 인덱스 불일치 문제가 발생하지 않습니다.
판다스의 이런 작동 방식은 처음 접할 때 다소 혼란스러울 수 있으나, 각 함수가 어떤 결과를 반환하는지, 그리고 인덱스가 어떻게 유지되는지를 이해하면 훨씬 수월해집니다. 데이터 분석에서는 이런 세부적인 부분에 대한 이해가 중요하므로, 실습을 통해 차근차근 익혀가시길 권합니다.
감사합니다.