У меня есть список ссылок
ref = ['September', 'August', 'July', 'June', 'May', 'April', 'March']
И датафрейм
df = pd.DataFrame({'Month_List': [['July'], ['August'], ['July', 'June'], ['May', 'April', 'March']]})
df
Month_List
0 [July]
1 [August]
2 [July, June]
3 [May, April, March]
Я хочу проверить, какие элементы из списка ссылок присутствуют в каждой строке, и преобразовать в двоичный список
Я могу добиться этого, используя apply
def convert_month_to_binary(ref,lst):
s = pd.Series(ref)
return s.isin(lst).astype(int).tolist()
df['Binary_Month_List'] = df['Month_List'].apply(lambda x: convert_month_to_binary(ref, x))
df
Month_List Binary_Month_List
0 [July] [0, 0, 1, 0, 0, 0, 0]
1 [August] [0, 1, 0, 0, 0, 0, 0]
2 [July, June] [0, 0, 1, 1, 0, 0, 0]
3 [May, April, March] [0, 0, 0, 0, 1, 1, 1]
Тем не менее, использование apply
для больших наборов данных очень медленное, и поэтому я собираюсь использовать векторизацию numpy. Как я могу улучшить свои показатели?
Расширение:
Я хотел использовать numpy vectorization
, потому что теперь мне нужно применить другую функцию в этом списке
Я пытаюсь так, но производительность очень низкая. Аналогичные результаты с apply
def count_one(lst):
index = [i for i, e in enumerate(lst) if e != 0]
return len(index)
vfunc = np.vectorize(count_one)
df['Value'] = vfunc(df['Binary_Month_List'])