【问题标题】:Pandas: Convert List Comprehension to Use ApplyPandas:将列表理解转换为使用 Apply
【发布时间】:2017-08-14 19:55:24
【问题描述】:

我目前有一个带有 beautiful_soup 列的 Pandas DataFrame(它包含一个 BeautifulSoup 对象)。我想为几个 HTML 标签添加一列(例如img 标签的数量)。

例如,这是我使用列表理解的旧代码:

df['text_img_count'] = [len(x.find_all('img')) for x in df['beautiful_soup']]

但是使用apply应该更快,所以我想转换这段代码。

我正在考虑编写一个可以传递给apply 的小函数,例如:

def get_imgs_count():

然后我会这样称呼它:

df['text_img_count'] = df['beautiful_soup'].apply(get_imgs_count)

因为我要为一堆 HTML 标签做这个,我真的不想写一大堆超级相似的函数。宁愿写这样的东西:

def get_tag_count(df, tag)

然后这样称呼它:

get_tag_count(df, 'img')

但我认为我不能将带参数的函数传递给 apply...

我该如何从列表理解转换为使用apply

谢谢!

【问题讨论】:

  • "但是使用 apply 应该更快," 你为什么会这样认为?确实,我愿意等价的列表理解比.apply
  • 确实,如果 speed 是您不想要的,那么您已经使用dtype=object 打了自己的脚
  • 无论如何,你可以将参数传递给你传递给.apply的函数,在.apply方法中使用args关键字。

标签: python pandas beautifulsoup


【解决方案1】:

我会使用functools'部分申请

from functools import partial
def get_tag_count(bs, tag):
    return [len(x.find_all(tag)) for x in bs]

get_image_count = partial(get_tag_count, tag = 'img')

df['text_img_count'] = df['beautiful_soup'].apply(get_image_count)

【讨论】:

  • 不需要partial.apply已经可以处理func的参数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-06
  • 1970-01-01
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
  • 2010-11-17
相关资源
最近更新 更多