Выберите и добавьте значения столбца из другого кадра данных, основываясь на том, существует ли индекс в обоих - PullRequest
1 голос
/ 30 мая 2019

У меня есть два кадра данных, давайте назовем их A и B, с одинаковыми индексами (идентификаторами лиц), но некоторые идентификаторы могут быть в A, а не в B, и наоборот. Кроме того, идентификаторы не уникальны в B, а уникальны в фрейме данных A, поэтому я хочу

Я хочу проверить B, чтобы увидеть, существуют ли определенные идентификаторы, а затем добавить столбец максимальной метки B в A для этого конкретного идентификатора.

Я пытался написать приведенную ниже функцию в качестве аргумента функции pappas .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: («Может сравнивать только идентично помеченные объекты Series», «произошло с индексом 0»)

Я знаю, что мог бы просто преобразовать оба индекса данных в списки Python, проверить, существует ли значение, а затем создать новый DataFrame, отображающий старые строки либо в помеченные значения, либо в значение по умолчанию -1, но я пытаюсь сделать все это в Pandas , чтобы использовать векторизацию.

Может ли кто-нибудь помочь мне найти краткий способ использовать только операции над кадрами вместо преобразования в списки Python?

1 Ответ

0 голосов
/ 30 мая 2019

Я думаю * вы сможете сделать это с помощью группового преобразования :

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

* Немного трудно точно понять, что пытается сделать ваш код ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...