【发布时间】:2018-02-10 22:56:48
【问题描述】:
我有一个带有“链接”列的数据框,其中包含数千篇在线文章的 URL。每个观察都有一个 URL。
urls_list = ['http://www.ajc.com/news/world/atlan...',
'http://www.seattletimes.com/sports/...',
'https://www.cjr.org/q_and_a/washing...',
'https://www.washingtonpost.com/grap...',
'https://www.nytimes.com/2017/09/01/...',
'http://www.oregonlive.com/silicon-f...']
df = pd.DataFrame(urls_list,columns=['Links'])
我还有一个字典,其中包含 出版物名称 作为键和 域名 作为值。
urls_dict = dict({'Atlanta Journal-Constitution':'ajc.com',
'The Washington Post':'washingtonpost.com',
'The New York Times':'nytimes.com'})
我想过滤数据框以仅获取那些“链接”列包含字典值中的域的观察结果,同时同时在字典键中分配出版物名称到新列“出版物”。我的设想是使用下面的代码创建“发布”列,然后从该列中删除None 以在事后过滤数据框。
pub_list = []
for row in df['Links']:
for k,v in urls_dict.items():
if row.find(v) > -1:
publication = k
else:
publication = None
pub_list.append(publication)
但是,我得到的回报列表pub_list - 虽然似乎按照我的意愿行事 - 是我的数据帧的三倍。有人可以建议如何修复上述代码吗?或者,或者,建议一个更清洁的解决方案,可以(1)使用字典值(域名)过滤我的数据框的“链接”列,同时(2)创建字典键的新“发布”列(出版物名称) ? (请注意,为简洁起见,此处创建的 df 只有一列;实际文件将有很多列,因此我必须能够指定要过滤的列。)
编辑:我想澄清一下 RagingRoosevelt 的 答案。我想避免使用合并,因为某些域可能不完全匹配。例如,对于ajc.com,我还希望能够捕获myajc.com,对于washingtonpost.com,我还希望获得像live.washingtonpost.com 这样的子域。因此,我希望使用str.contains()、find() 或in 运算符找到一种“在字符串中查找子字符串”的解决方案。
【问题讨论】:
标签: python python-3.x dictionary for-loop dataframe