在 pd.dataframe 系列上使用 .find()

Using .find() on a pd.dataframe series

我有以下 df:

data = {'Org':  ['<a href="/00xO" target="_blank">Chocolate</a>'],
        'Owner': ['Charlie']
        }

df = pd.DataFrame(data)

print (df)

当我应用下面的 lamba 函数而不是给我 'Chocolate' 时,它返回 0。

df['Correct Org']=df['Org'].apply(lambda st: st[st.find(">"):st.find("<")])

我试过按如下方式添加 'str':

df['Correct Org']=df['Org'].str.apply(lambda st: st[st.find(">")+1:st.find("<")])

& 得到以下错误:

AttributeError: 'StringMethods' object has no attribute 'apply'

使用 BeautifulSoup 解析 html 标签:

from bs4 import BeautifulSoup

df['Correct Org']=df['Org'].apply(lambda st: ','.join(BeautifulSoup(st, features="lxml").findAll(text=True)))

你得到 None 返回,因为 df['Org'][0].find(">") returns 31 但 df['Org'][0].find("<") returns 0。所以不清楚 st[st.find(">"):st.find("<") 是什么方法。可以使用bs4.BeautifulSoup创建一个soup对象,直接获取a里面的文字:

from bs4 import BeautifulSoup
df['Org'] = df['Org'].apply(lambda x: BeautifulSoup(x).text)

输出:

         Org    Owner
0  Chocolate  Charlie

如果你不想用BeautifulSoup,我写了一个简单的函数给你

获取LINK文本的函数

def getOrg(link):
    link = str(link)
    link = link[link.find('>'):link.find("</")]
    return link.replace(link[0], '')

例如

import pandas as pd

data = {'Org':  ['<a href="/00xO" target="_blank">Chocolate</a>'],
        'Owner': ['Charlie']
        }

df = pd.DataFrame(data)


# Function Call
getOrg(df['Org'])

输出

Chocolate