• 카테고리

    질문 & 답변
  • 세부 분야

    딥러닝 · 머신러닝

  • 해결 여부

    미해결

모르는 부분이 있어 질문 드립니다.

21.04.26 22:20 작성 조회수 147

0

결정트리 실습 부분에서

def

get_new_feature_name_df(old_feature_name_df):

    feature_dup_df = pd.DataFrame(data = old_feature_name_df.groupby('column_name').cumcount(),

                                 columns = ['dup_cnt'])

    feature_dup_df = feature_dup_df.reset_index()

    A = old_feature_name_df.reset_index()

    new_feature_name_df = pd.merge(old_feature_name_df.reset_index(), feature_dup_df, how = 'outer')

    new_feature_name_df['column_name'] = new_feature_name_df[['column_name',

                                                             'dup_cnt']].apply(lambda x : x[0]+'_'+str(x[1])

                                                                             if x[1] >0 else x[0] ,  axis=1)

    new_feature_name_df = new_feature_name_df.drop(['index'], axis=1)

#     print(feature_dup_df)

#     print(A)

#     print(new_feature_name_df)

    return A

get_new_feature_name_df(feature_name_df)

pd.merge를 통하여 병합한다는 부분까지는 이해를 했는데,

    new_feature_name_df['column_name'] = new_feature_name_df[['column_name',

                                                             'dup_cnt']].apply(lambda x : x[0]+'_'+str(x[1])

                                                                             if x[1] >0 else x[0] ,  axis=1)

lambda 부분에서 전 강의를 복습하고 와도 이해가 안가 질문남깁니다. 어떻게 해석 하면 되는지 궁금합니다.

답변 1

답변을 작성해보세요.

0

안녕하십니까,

new_feature_name_df[['column_name',  'dup_cnt']]

는 컬럼명(column_name)과 해당 컬럼명으로 중복되는 횟수(dup_cnt)를 가지고 있습니다.  만약 해당 컬럼이 중복이 되지 않는 고유한 컬럼명일때 dup_cnt는 0 입니다. 중복이 될 경우 중복이 될 경우 개별 중복 인덱스 값을 가집니다. 즉 특정 컬럼명이 2개가 중복 될 경우 각각 1, 2 로 dup_cnt가 할당 됩니다.

new_feature_name_df[new_feature_name_df['dup_cnt'] > 0] 의 일부 결과는 아래와 같습니다.

column_index column_name dup_cnt

317 fBodyAcc-bandsEnergy()-1,8_1 1
318 fBodyAcc-bandsEnergy()-9,16_1 1
319 fBodyAcc-bandsEnergy()-17,24_1 1
320 fBodyAcc-bandsEnergy()-25,32_1 1

new_feature_name_df[['column_name', 'dup_cnt']].apply(lambda x : x[0]+'_'+str(x[1])  if x[1] >0 else x[0] ,  axis=1) 를 적용하면 개별 row별로 두개의 값이 apply lambda 식으로 입력 됩니다. x[0]와 x[1]이며 x[0]는 column_name, x1은 dup_cnt입니다.

lambda x : x[0]+'_'+str(x[1])  if x[1] >0 는 만약 x[1] 즉 dup_cnt > 0 보다 클 경우 원본 컬럼명 x[0]에 '_' 그리고 x1값을 결합해서 새로운 컬럼으로 만듭니다.  예를 들어 fBodyAcc-bandsEnergy()-1,8 이라는 컬럼명이 2개가 있을 때 fBodyAcc-bandsEnergy()-1,8_1, fBodyAcc-bandsEnergy()-1,8_2로 변경합니다.

else x[0] 은 x[1] 즉 dup_cnt > 0 이 아닌 경우(중복이 없는 경우)는 기존 컬럼값을 그대로 이용합니다.

감사합니다.