【问题标题】:Cleaning up URL column in pandas dataframe清理熊猫数据框中的 URL 列
【发布时间】:2017-04-29 16:54:19
【问题描述】:

我有内容如下的 csv(或数据框):

date          | URLs                                         | Count
-----------------------------------------------------------------------
17-mar-2014   | www.example.com/abcdef&=randstring           | 20
10-mar-2016   | www.example.com/xyzabc                       | 12
14-apr-2015   | www.example.com/abcdef                       | 11
12-mar-2016   | www.example.com/abcdef/randstring            | 30
15-mar-2016   | www.example.com/abcdef                       | 10
17-feb-2016   | www.example.com/xyzabc&=randstring           | 15
17-mar-2016   | www.example.com/abcdef&=someotherrandstring  | 12

我想清理我想将www.example.com/abcdef&=randstringwww.example.com/abcdef/randstring 转换为 www.example.com/abcdef 的列“URLs”,等等。

我尝试使用 urlparse 库并解析 URL 以仅组合 urlparse(url).netlocurlparse(url).path/query/params。但是,由于每个 URL 都会导致完全不同的路径/查询/参数,因此它的效率很低。

有没有使用 pandas 解决这个问题的方法?非常感谢任何提示/建议。

【问题讨论】:

  • 你不需要解析任何东西,只需在第一个'&'/'处截断字符串?' .如果您想保留“/查询”部分,也不清楚您写的内容。这是简单的字符串操作,几乎没有正则表达式领域。

标签: python regex pandas url dataframe


【解决方案1】:

我认为您可以使用extract by regex - 在www.com 之间过滤由a-zA-Z 创建的所有字符串,以及另一个以/ 开头的字符串:

print (df.URLs.str.extract('(www.[a-zA-Z]*.com/[a-zA-Z]*)', expand=False))
0    www.example.com/abcdef
1    www.example.com/xyzabc
2    www.example.com/abcdef
3    www.example.com/abcdef
4    www.example.com/abcdef
5    www.example.com/xyzabc
6    www.example.com/abcdef
Name: URLs, dtype: object

【讨论】:

  • 我最初尝试过这个。但是 abcdef/xyzabc 的列表很大 :( 。所以,恐怕这很合适 :(
  • 也不工作。 abcdef/xyzabc 有时包含数字或特殊字符。但是,随机字符串以 ?或 & 符号。
  • 是的,但是某些字符串不包含?& ?
  • 我认为www.example.com/abcdef/randstring
  • www.example.com/abc.13&randstring 和 www.example.com/xyz.12.56?randstring 是示例。所以我只想在之后摆脱任何东西?或 &。
【解决方案2】:

我认为它与正则表达式的关系比 pandas 更多,尝试使用 pandas.apply 更改一列。

import pandas as pd
import re

def clear_url(origin_url):
    p = re.compile('(www.example.com/[a-zA-Z]*)')
    r = p.search(origin_url)
    if r:
        return r.groups(1)[0]
    else:
        return origin_url


d = [
    {'id':1, 'url':'www.example.com/abcdef&=randstring'},
    {'id':2, 'url':'www.example.com/abcdef'},
    {'id':3, 'url':'www.example.com/xyzabc&=randstring'}
]
df = pd.DataFrame(d)

print 'origin_df'
print df

df['url'] = df['url'].apply(clear_url)
print 'new_df'
print df

输出:

origin_df
id                                 url
0   1  www.example.com/abcdef&=randstring
1   2              www.example.com/abcdef
2   3  www.example.com/xyzabc&=randstring
new_df
id                     url
0   1  www.example.com/abcdef
1   2  www.example.com/abcdef
2   3  www.example.com/xyzabc

【讨论】:

  • 这应该可以。我正在将应用功能用于其他用途。无法像您一样将它与正则表达式一起使用。一旦我检查,我会接受它。谢谢。
  • 实际上这不起作用 :( url 的结构类似于 www.example.com/StringWhichContainsAlmosteverything 后跟 ? 或 & 和一个随机字符串。所以我只需要保留 tringWhichContainsAlmosteverything。像 RegEx 这样以 $ 或 & 结尾的东西?
  • 您的示例中的所有字符串似乎都有“/”或“?”,所以我猜它可能只使用 a-z 来提取之前的单词。对于字符串不起作用,您可以在此处粘贴一个示例吗?
猜你喜欢
  • 2019-05-13
  • 2013-04-03
  • 1970-01-01
  • 2020-06-03
  • 2022-01-13
  • 2018-12-17
  • 2018-10-29
  • 2022-11-03
  • 1970-01-01
相关资源
最近更新 更多