Html 在对数据帧进行子集设置时,值不在索引中
我在Python中的数据帧方面遇到了问题 我只想要那些带有特定文本(“Grado en”)的列,但我得到了一个错误: 当不存在NA或NaN时,无法使用包含NA/NaN值的向量进行索引 如果我使用选项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
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)
将其应用于上一个输出。