У меня есть два кадра данных, давайте назовем их 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?