python - 将 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()
解决方案
你可以尝试这样的事情:
...
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
推荐阅读
- node.js - 定义无限循环以从 API 读取数据并与数据库进行比较的最佳位置
- sql - 在另一列中选择具有相同 id 但相同值的行
- coq - 用 list_beq 证明列表的相等性
- magento2 - Magento 2 自定义控制台命令创建具有角色的管理员用户,Laminas 服务定位器问题
- database - 为什么 laradock 为不同的项目使用一个数据库?
- node.js - 错误 [ERR_HTTP_HEADERS_SENT]:发送到客户端后无法设置标头 | NodeJS ExpressJS MySQL
- ruby-on-rails - 如何在 Rails 中加密 csv/xlsx 文件
- python - AES 128 如何在 python 中使用部分密钥进行暴力破解
- php - FFMpeg 将音频文件连接在一起,最后一个文件作为背景
- html - CSS:在英雄图像上方制作浮动导航栏的最佳方法?