【问题标题】:Value not in index when subsetting dataframe子集数据框时值不在索引中
【发布时间】:2018-09-25 08:25:35
【问题描述】:

我在使用 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=True 返回所有行

标签: html python-3.x pandas parsing beautifulsoup


【解决方案1】:

这适用于熊猫 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"
)

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 好的,我知道了,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) 到上一个输出。
    猜你喜欢
    • 2023-02-13
    • 2019-02-16
    • 1970-01-01
    • 2019-03-22
    • 2016-06-26
    • 1970-01-01
    • 2014-06-21
    • 2020-01-12
    • 1970-01-01
    相关资源
    最近更新 更多