假设我有一个如下的数据帧,
data
id URL
1 www.pandora.com
2 m.jcpenney.com
3 www.youtube.com
4 www.facebook.com我希望grep并在URL中找到特定的单词,并在其中创建一个新列。假设我想在这里单独找到youtube和facebook,我的理想输出是,
id URL host
1 www.pandora.com None
2 m.jcpenney.com None
3 www.youtube.com youtube
4 www.facebook.com facebookURL在真实数据集中是非常复杂的,而且行数也非常高(~4M)。所以我想单独找到3-4个特定的主机,并通过一个新的列来识别它们。
以下是我的尝试:
for i in data['URL']:
re.search('youtube', i)但我得到了,
TypeError: expected string or buffer这里有错误。我想在同一个dataframe中创建一个新列,其中我会给出3-4个主机的条件,而在该列中剩余的条件将为none。有人能帮我吗?
谢谢
发布于 2016-04-19 04:41:01
我们首先实例化数据框并创建一个新的列host。
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在此阶段,数据框如下所示:
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']列。
for item in ['youtube', 'facebook']:
df['host'][df['URL'].str.contains(item)] = item现在数据框如下所示:
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
警告只是告诉我们,我们正在覆盖某些位置的数据。在我们的例子中,我们用youtube或facebook覆盖了'host'中的None。因此,在我们的例子中,警告被安全地忽略了。
您提到的所有搜索都是子字符串搜索(检查youtube是否是子字符串,等等)。但是,可以使用findall方法执行更复杂的正则表达式搜索。
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))] = itemfindall将正则表达式、(youtube)等应用于数据帧。然后,如果为len(x) == 0,则将项映射到False。也就是说,当且仅当正则表达式找到匹配项时,项才为True。使用True/False序列作为掩码,我们设置与匹配值匹配的所有项:youtube。
https://stackoverflow.com/questions/36700246
复制相似问题