如何在Pandas中提取DataFrame的Tags列中所有含player的子串(取至逗号或字符串末尾)
我来帮你搞定这个问题!你之前用str.extract()没成功,主要有两个原因:一是extract()默认只捕获第一个匹配项,二是你的正则表达式写法不正确。我们需要用能捕获所有匹配结果的方法,再把它们拼接成需要的格式。
步骤1:使用str.findall()捕获所有匹配项
str.findall()会返回每行中所有符合正则的子串组成的列表,正好满足你提取所有含'player'内容的需求。配合合适的正则表达式,就能精准定位每个目标子串:
import pandas as pd # 假设你的DataFrame是df df['Extracted_Tags'] = df['Tags'].str.findall(r'\bplayer[^,]*')
步骤2:将列表转为逗号分隔的字符串
findall()返回的是列表,我们可以用str.join()把列表元素拼成逗号分隔的字符串,和你期望的输出格式一致:
df['Extracted_Tags'] = df['Extracted_Tags'].str.join(',')
也可以把两步合并成一行:
df['Extracted_Tags'] = df['Tags'].str.findall(r'\bplayer[^,]*').str.join(',')
正则表达式解释
这里的正则r'\bplayer[^,]*'各部分作用:
\b:单词边界,确保我们匹配的是以player开头的完整元素(如果你的数据里存在类似xyzplayer的情况不需要排除,可以去掉\b)player:匹配你需要的关键词[^,]*:匹配任意数量的非逗号字符,这样就能自动截取从player开始,到下一个逗号(或者字符串末尾)的整个子串,完美符合你的要求
测试你的示例
用你给出的Tags内容测试:
'view_snapshot_hi:hab,like_hi:hab,view_snapshot_foinbra,completed_profile,view_page_investors_landing,view_foinbra_inv_step1,view_foinbra_inv_step2,view_foinbra_inv_step3,view_snapshot_acium, player ,view_acium_inv_step1,view_acium_inv_step2,view_acium_inv_step3, player_acium-ronda-2_r1 ,view_foinbra_rinv_step1,view_page_makers_landing'
运行代码后,Extracted_Tags列会得到:player,player_acium-ronda-2_r1,完全符合你的期望。
为什么你原来的代码无效?
你之前的正则r'*player*,?\s*'是语法错误的:*是量词(表示0次或多次),不能直接放在正则开头;另外str.extract()只会返回第一个匹配的结果,即使正则正确,也无法提取所有符合条件的内容。
内容的提问来源于stack exchange,提问作者Diego González Castellanos

