У меня есть df
, который содержит мои основные данные, у которого есть миллион rows
. Мои основные данные также имеют 30 columns
. Теперь я хочу добавить еще один столбец в мой df
, называемый category
. category
является column
в df2
, который содержит около 700 rows
и еще два columns
, которые будут совпадать с двумя columns
в df
.
Я начинаю с установки index
в df2
и df
, которая будет соответствовать между кадрами, однако некоторые из index
в df2
не существуют в df
.
Остальные столбцы в df2
называются AUTHOR_NAME
и category
.
Соответствующий столбец в df
называется AUTHOR_NAME
.
Некоторые из AUTHOR_NAME
в df
не существуют в df2
и наоборот.
Мне нужна инструкция: когда index
в df
соответствует index
в df2
и title
в df
соответствует title
в df2
, добавьте category
в df
, иначе добавьте NaN в category
.
Пример данных:
df2
AUTHOR_NAME CATEGORY
Index
Pub1 author1 main
Pub2 author1 main
Pub3 author1 main
Pub1 author2 sub
Pub3 author2 sub
Pub2 author4 sub
df
AUTHOR_NAME ...n amount of other columns
Index
Pub1 author1
Pub2 author1
Pub1 author2
Pub1 author3
Pub2 author4
expected_result
AUTHOR_NAME CATEGORY ...n amount of other columns
Index
Pub1 author1 main
Pub2 author1 main
Pub1 author2 sub
Pub1 author3 NaN
Pub2 author4 sub
Если я использую df2.merge(df,left_index=True,right_index=True,how='left', on=['AUTHOR_NAME'])
, мой df
будет в три раза больше, чем предполагается.
Поэтому я думал, что слияние было неправильным способом. То, что я действительно пытаюсь сделать, это использовать df2
в качестве таблицы поиска, а затем вернуть значения type
в df
в зависимости от того, выполняются ли определенные условия.
def calculate_category(df2, d):
category_row = df2[(df2["Index"] == d["Index"]) & (df2["AUTHOR_NAME"] == d["AUTHOR_NAME"])]
return str(category_row['CATEGORY'].iat[0])
df.apply(lambda d: calculate_category(df2, d), axis=1)
Однако это вызывает ошибку:
IndexError: ('index out of bounds', u'occurred at index 7614')