首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在dataframe列的每一行中查找一个单词,并添加一个新列- Python

在dataframe列的每一行中查找一个单词,并添加一个新列- Python
EN

Stack Overflow用户
提问于 2016-04-19 01:11:18
回答 1查看 3.2K关注 0票数 1

假设我有一个如下的数据帧,

代码语言:javascript
复制
data

    id  URL
    1   www.pandora.com
    2   m.jcpenney.com
    3   www.youtube.com
    4   www.facebook.com

我希望grep并在URL中找到特定的单词,并在其中创建一个新列。假设我想在这里单独找到youtube和facebook,我的理想输出是,

代码语言:javascript
复制
id  URL                 host
1   www.pandora.com     None
2   m.jcpenney.com      None
3   www.youtube.com     youtube
4   www.facebook.com    facebook

URL在真实数据集中是非常复杂的,而且行数也非常高(~4M)。所以我想单独找到3-4个特定的主机,并通过一个新的列来识别它们。

以下是我的尝试:

代码语言:javascript
复制
for i in data['URL']:
    re.search('youtube', i)

但我得到了,

代码语言:javascript
复制
TypeError: expected string or buffer

这里有错误。我想在同一个dataframe中创建一个新列,其中我会给出3-4个主机的条件,而在该列中剩余的条件将为none。有人能帮我吗?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2016-04-19 04:41:01

我们首先实例化数据框并创建一个新的列host

代码语言:javascript
复制
import pandas as pd
df = pd.DataFrame({'id': [1,2,3,4],
                   'URL': ['www.pandora.com', 'm.jcpenney.com', 'www.youtube.com', 'www.facebook.com']})
df['host'] = None

在此阶段,数据框如下所示:

代码语言:javascript
复制
id  URL                 host
1   www.pandora.com     None
2   m.jcpenney.com      None
3   www.youtube.com     None
4   www.facebook.com    None

我们可以创建一个for循环来在URL列中搜索子字符串。下面的代码仅在URL列包含搜索项的位置写入df['host']列。

代码语言:javascript
复制
for item in ['youtube', 'facebook']:
    df['host'][df['URL'].str.contains(item)] = item

现在数据框如下所示:

代码语言:javascript
复制
id  URL                 host
1   www.pandora.com     None
2   m.jcpenney.com      None
3   www.youtube.com     youtube
4   www.facebook.com    facebook

请注意,您可能会收到以下警告:

C:\Anaconda3\envs\pyvizz\lib\site-packages\ipykernel\__main__.py:2: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame

警告只是告诉我们,我们正在覆盖某些位置的数据。在我们的例子中,我们用youtubefacebook覆盖了'host'中的None。因此,在我们的例子中,警告被安全地忽略了。

您提到的所有搜索都是子字符串搜索(检查youtube是否是子字符串,等等)。但是,可以使用findall方法执行更复杂的正则表达式搜索。

代码语言:javascript
复制
import re
for item in ['youtube', 'facebook']:
    results = df['URL'].str.findall('(%s)' % item)
    df['host'][pd.Series(map(lambda x: False if len(x) == 0 else True, results))] = item

findall将正则表达式、(youtube)等应用于数据帧。然后,如果为len(x) == 0,则将项映射到False。也就是说,当且仅当正则表达式找到匹配项时,项才为True。使用True/False序列作为掩码,我们设置与匹配值匹配的所有项:youtube

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36700246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档