>source

2 개의 데이터 프레임이 있는데 A 라고합시다  그리고 B 동일한 색인 (개인 ID)을 사용하지만 일부 ID는 B가 아닌 A에있을 수 있으며 그 반대의 경우도 있습니다. 또한, ID는 B 에서 고유하지 않습니다 데이터 프레임 A 에서 고유 한 반면 이므로

B 를 확인하고 싶습니다  특정 ID가 있는지 확인하려면 해당 B에 대해 최대 B- 라벨 열을 A에 추가하십시오.

팬더 .apply () 함수에 대한 인수로 아래 함수를 작성하려고했습니다.

def add_labels_to_dataframe(train_df,
                        id_col_name='person_id',
                        label_name="max_progress",
                        label_filepath=LABELS_SRC_FILE,
                        default_value=-1,
                        save=True):
"""
Add labels column to train_df
:param train_df: (DataFrame)
    the training dataframe that needs labels
:param id_col_name: (str)
    name of the ID column to use
:param label_name: (str)
    the column name of the label to use (score/progress/is_X/etc)
:param label_filepath: (str)
    filepath with IDs and associated labels
:param default_value: (int, or anything)
    The default label to give when a person_id has no associated label
:return: (DataFrame)
    updated dataframe with labels
"""
labels_df = pd.read_csv(label_filepath)
def get_max_score(row):
    """
    DataFrame function to select max score when multiple exist per ID
    :param row: (DataFrame)
        A single row of the dataframe being modified
    :return: (int)
        returns elements of a Series that becomes a new column of the DataFrame
    """
    # if person_id is in labels, then get max of labels
    pdb.set_trace()
    pid_labels_df = labels_df[row[id_col_name].isin(labels_df[id_col_name])]
    if not pid_labels_df.empty and not pd.isnull(pid_labels_df[label_name].max()):
        return 1 + pid_labels_df[label_name].max()
    return default_value

train_df[label_name] = train_df.apply(get_max_score, axis=1)
if save:
    train_df.to_csv(LABELED_TRAIN_DF_PATH)
return train_df

ValueError: ('Can only compare identically-labeled Series objects', 'occurred at index 0')

두 데이터 프레임 인덱스를 모두 파이썬 목록으로 변환하고 값이 존재하는지 확인한 다음 레이블이 지정된 값이나 기본 -1로 오래된 행을 매핑하는 새 DataFrame을 만들 수 있지만 Pandas 내 에서이 작업을 모두 수행하려고합니다. 벡터화를 활용하기 위해

여기서 파이썬 목록으로 캐스팅하는 대신 데이터 프레임 작업 만 사용하는 간결한 방법을 알아낼 수 있습니까?


  • 답변 # 1

    그룹 별 변환으로이 작업을 수행 할 수있을 것 같아요 :

    df[label_name] = df.groupby("person_id").transform("max")
    
    

    * 코드가 무엇을하려고하는지 정확하게 읽는 것은 조금 어렵습니다 ...

관련 자료

  • 이전 javascript - Mongo Document Array 내부의 객체를 업데이트하는 방법 (특정 색인)
  • 다음 clojure - MongoDB에서 UUID 유형 값 쿼리