Лучше всего разбить его на последовательные шаги:
import pandas as pd
import numpy as np
columns = ["Book_Name", "Book_Ids", "Countries_Published"]
data = np.array([
['Book_A', [123], ['USA']],
['Book_B', [4670,1122], ['Canada', 'USA']],
['Book_C', [11,200,7688], ['Japan', 'USA', 'Canada']],
['Book_D', [500,400,600], ['NaN', 'Japan', 'Canada']],
['Book_E', [987], ['Japan']],
])
df = pd.DataFrame(data, columns=columns)
Функция ранжирования элементов по стране
def country_rank(item, ranking=['USA', 'Canada', 'Japan']):
try:
i = ranking.index(item[0])
except ValueError:
i = len(ranking)
return i
print(country_rank(('Canada', 999))) # 1
Функция для объединения стран и идентификаторов, а затем выбора страны с номер наименьшего ранга:
def pick_book_id(x):
book_ids = list(zip(x['Countries_Published'], x['Book_Ids']))
return min(book_ids, key=country_rank)
pick_book_id(df.loc[1]) # ('USA', 1122)
Сложите все вместе:
df['Selected IDs'] = df.apply(pick_book_id, axis=1)
print(df)
Вывод:
Book_Name Book_Ids Countries_Published Selected IDs
0 Book_A [123] [USA] (USA, 123)
1 Book_B [4670, 1122] [Canada, USA] (USA, 1122)
2 Book_C [11, 200, 7688] [Japan, USA, Canada] (USA, 200)
3 Book_D [500, 400, 600] [NaN, Japan, Canada] (Canada, 600)
4 Book_E [987] [Japan] (Japan, 987)