pandas - 在 Pandas 中将项目从一列映射到新列的有效方法
问题描述
假设我有一个 Pandas df df_1
,其中一行如下所示:
ID | rank_url_agg | url_list |
---|---|---|
2223 | ['gtech.com','gm.com', 'ford.com'] | ['google.com','gtech.com','autoblog.com','gm.com','ford.com'] |
我想创建一个名为的新列url_list_agg
,它为每一行执行以下操作:
- 遍历中的 URL
url_list
rank_url_agg
如果同一行中不存在 URL ,则分配值 0。- 如果 URL 存在于 中
rank_url_agg
,则分配与列表长度与rank_url_agg
该 URL 中的索引之间的差相对应的值rank_url_agg
。 - 完成对 中的所有 URL 的迭代后
url_list
,将结果包装到一个列表中。
所以最后,新url_list_agg
列中的第一行将变为[0,3,0,2,1]
.
我尝试运行以下脚本(仅测试第一行而不是整个数据框):
for item in agg_report['url_list'][0]:
if item in agg_report['rank_url_agg'][0]:
item=len(rank_url_agg[0]) - agg_report['rank_url_agg'][0].index(item)
else:
item=0
但是当我检查时agg_report['url_list'][0]
,它仍然只返回这个列表:['google.com','gtech.com','autoblog.com','gm.com', 'ford.com']
。所以我的代码不起作用。
任何有关如何为数据框中的每一行实现此目标的建议都将不胜感激!
解决方案
您没有分配回实际的数据框。
def idx(a, b):
return [len(a) - a.index(x) if x in a else 0 for x in b]
df_1 = df_1.assign(url_list_agg=[*map(idx, df_1.rank_url_agg, df_1.url_list)])
推荐阅读
- laravel - 使用 Laravel 8 从 Redis 中删除延迟的作业
- spring-boot - spring-data-jpa hibernate:无法延迟初始化集合,无法初始化代理 - 没有会话
- android - MAPBOX:当我运行没有错误的应用程序时,地图没有出现(在 Kotlin 中开发 - 用于 android - 片段中的地图)
- regex - 如何在正则表达式中只允许 WhatsApp 格式的数字?
- javascript - 承诺:掷骰子异步
- sql - 左连接问题
- javascript - 从无效 JSON 的字符串中提取数组
- php - 在 PHP 中使用 SQL 将数据从一列复制到另一列但更改数据类型
- entity-framework-core - 从基类继承日志服务
- php - WooCommerce 仅针对某些类别隐藏价格