Html 在对数据帧进行子集设置时,值不在索引中

Html 在对数据帧进行子集设置时,值不在索引中,html,python-3.x,pandas,parsing,beautifulsoup,Html,Python 3.x,Pandas,Parsing,Beautifulsoup,我在Python中的数据帧方面遇到了问题 我只想要那些带有特定文本(“Grado en”)的列,但我得到了一个错误: 当不存在NA或NaN时,无法使用包含NA/NaN值的向量进行索引 如果我使用选项na=False,它将返回一个空数据帧。我已经找到了解决办法,但什么也找不到 这是我的密码: from urllib.request import urlopen from bs4 import BeautifulSoup import datetime import pandas as pd li

我在Python中的数据帧方面遇到了问题

我只想要那些带有特定文本(“Grado en”)的列,但我得到了一个错误:

当不存在NA或NaN时,无法使用包含NA/NaN值的向量进行索引

如果我使用选项
na=False
,它将返回一个空数据帧。我已经找到了解决办法,但什么也找不到

这是我的密码:

from urllib.request import urlopen
from bs4 import BeautifulSoup
import datetime
import pandas as pd

list_of_titles_graus = []

html_graus = urlopen("https://www.universidadviu.es/grados-online") # Insert your URL to extract
bsObj_graus = BeautifulSoup(html_graus.read());

    for link in bsObj_graus.find_all('div'):
        list_of_titles_graus.append((link.span))


df_graus = pd.DataFrame({'title': list_of_titles_graus})

#Depuramos para que nos queden solo los titulos de los grados.

graudep = df_graus.dropna() #Eliminamos N/As
graudep = graudep.drop_duplicates() # Eliminamos duplicados.

#Check if there are NA or NaN
graudep.isnull().sum().sum()
graudep.isna().sum().sum()

#This gives me the error.
graudep = graudep[(graudep['title'].str.contains("Grado en"))]

KeyError: '[nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n nan nan...] not in index'

#This doesn't do anything.
graudep = graudep[(graudep['title'].str.contains("Grado en", na=True))]

#This returns an empty dataframe.
graudep = graudep[(graudep['title'].str.contains("Grado en", na=False))]
我期望的输出如下:

207  Grado en Psicología
221  Grado en Educación Primaria
233  Grado en Derecho
245  Grado en Traducción e Interpretación
257  Grado en Ingeniería Informática
269  Grado en Relaciones Internacionales
281  Grado en Trabajo Social
293  Grado en Administración y Dirección de E...
306  Grado en Educación Infantil
318  Grado en Criminología y Ciencias de la S...
330  Grado en Musicología
342  Grado en Economía

提前感谢

如果您确定没有NA,那么可以尝试以下方法:

graudep.loc[graudep.title.apply(lambda elt: "Grado en" in elt)]

这适用于熊猫0.23.3:

(df_graus
  .assign(title = lambda d: d.title.apply(str)) # convert title elements from bs4 to string 
  .loc[lambda d: d.title.apply(lambda elt: "Grado en" in elt)] # filter in strings that contain "Grado en"
)

这对我不起作用。。。我做错什么了吗?你是对的。na=True返回所有行。我知道,
graudep.title
不是字符串序列,而是
bs4.element.Tag
序列。因此:
df_graus.assign(title=lambda d:d.title.apply(str)).loc[lambda d:d.title.apply(lambda elt:Grado en in elt)]
应该完成这项工作。它成功了!我可以麻烦你,请你简单解释一下它是如何工作的吗?另外,我如何将它转换为文本以消除标记?有关简要解释,请参阅我的缩进评论回复。要去除标记,请使用
.apply(lambda elt:BeautifulSoup(elt).text)
将其应用于上一个输出。