Добавить результаты серии из apply () в новый DataFrame? - PullRequest
1 голос
/ 06 мая 2020

У меня есть функция apply, которая просматривает список индексов, подключает его к модели scikit-learn KNN и возвращает два списка размером n (расстояния до соседей и индексы соседей). (Представьте, что это для системы рекомендаций mov ie.)

Я хочу добавить эти результаты в новый DF.

Пример: если моя функция выполняет итерацию по 3 индексам, а параметр n-neighbour равен 5, я должен получить DataFrame с 2 столбцами и длиной 3x5 = 15. Но в настоящее время мой сценарий добавляет весь список в одну строку, как показано ниже. enter image description here

Это мой код. movies - это DF, который имеет входные индексы.

testDF = pd.DataFrame()

def get_distances_indices(index):

    distances, indices = model_knn.kneighbors(data[index], n_neighbors=6)

    distances = pd.Series(distances.flatten().tolist())
    indices = pd.Series(indices.flatten().tolist())

    return indices, distances

testDF[['index','distance']] = testDF.append(movies.apply(lambda row: get_distances_indices(row['index']), axis=1).apply(pd.Series),ignore_index=True)

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

Для простоты вот воспроизводимый пример: я просто хочу, чтобы списки / серии были отображаются в вертикальном порядке, а не по горизонтали.

testDF = pd.DataFrame()
moviesData = {'movie': ['The Big Whale', 'Stack Underflow'], 'index': [3, 99]}
movies = pd.DataFrame(data=moviesData)

def get_distances_indices(index):
    list1 = [51, 700, 999]
    list2 = [.2, .3, .4]
    df2 = pd.Series(list1)
    df3 = pd.Series(list2)

    return df2,df3

testDF[['index','distance']] = movies.apply(lambda row: get_distances_indices(row['index']), axis=1).apply(pd.Series)
testDF.head()

1 Ответ

1 голос
/ 07 мая 2020

Вы можете попробовать что-то вроде этого:

...

def get_distances_indices(index):
    list1 = [51, 700, 999]
    list2 = [.2, .3, .4]

    # return a dictionary
    return {'index':list1, 'distance':list2}

d = movies.apply(lambda row: get_distances_indices(row['index']), axis=1)

# flatten the resulting lists
l1 = [item for sublist in [x['index'] for x in d] for item in sublist]
l2 = [item for sublist in [x['distance'] for x in d] for item in sublist]

data_tuples = list(zip(l1,l2))
pd.DataFrame(data=data_tuples, columns=['index', 'distance'], index=None,)

Если я правильно понял ваш вопрос, это должно дать вам желаемый результат:

index   distance
0   51  0.2
1   700 0.3
2   999 0.4
3   51  0.2
4   700 0.3
5   999 0.4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...