首页 > 解决方案 > 将 apply() 的系列结果附加到新的 DataFrame?

问题描述

我有一个 apply 函数,它遍历索引列表,将其插入 scikit-learn KNN 模型,并返回两个n大小的列表(邻居距离和邻居索引)。(想象这是一个电影推荐系统)。

我想将这些结果添加到新的 DF 中。

例如:如果我的函数遍历 3 个索引,并且 n-neighbor 参数为 5,我应该得到一个具有 2 个列且长度为 3x5=15 的 DataFrame。但目前我的脚本正在将整个列表附加到一行,如下所示。 在此处输入图像描述

这是我的代码。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()

标签: pythonpandaslambdaappendapply

解决方案


你可以尝试这样的事情:

...

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

推荐阅读