【问题标题】:How to remove characters after last period in df column python?如何在 df 列 python 中的最后一个句点之后删除字符?
【发布时间】:2022-01-24 00:53:06
【问题描述】:

所以我有一个 df,其中有一列满是域。所以例如我有这样的记录

common_name
www.amazon.com
amazon.com 
subexample.amazon.com
walmart.en
walmart.uk
michigan.edu

我想用 python 来提取最后一个 .但在第一个时期之前,如果有的话。所以结果应该是这样的。

common_name
amazon
amazon
amazon 
walmart
walmart
michigan

我找到了一些 here 的例子,但它看起来像是一个字符串上的运算符,它是某个字符之前的任何东西,而不是它们之间的任何东西。字符串运算符可能需要一段时间才能运行,所以想知道是否有一个函数偶然在整个 df 上使用了 pandas?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您可以将pd.DataFrame.<b>apply</b> 与一个 lambda 函数一起使用,该函数在拆分后返回最长的元素(基于 richardec's answer 中的注释):

    In [1]: import pandas as pd
    In [2]: d = {
       ...:     'domains': [
       ...:         'common_name',
       ...:         'www.amazon.com',
       ...:         'amazon.com',
       ...:         'subexample.amazon.com',
       ...:         'walmart.en',
       ...:         'walmart.uk',
       ...:         'michigan.edu',
       ...:         'tkoutletstore.co.uk',
       ...:         'tillyandotto.com.au',
       ...:     ]
       ...: }
       ...: df = pd.DataFrame(data=d)
       ...: df
    Out[2]: 
                     domains
    0            common_name
    1         www.amazon.com
    2             amazon.com
    3  subexample.amazon.com
    4             walmart.en
    5             walmart.uk
    6           michigan.edu
    7    tkoutletstore.co.uk
    8    tillyandotto.com.au
    In [3]: df['extracted'] = df['domains'].apply(lambda d: max(d.split('.'), key=len))
    
    In [4]: df
    Out[4]: 
                     domains      extracted
    0            common_name    common_name
    1         www.amazon.com         amazon
    2             amazon.com         amazon
    3  subexample.amazon.com     subexample
    4             walmart.en        walmart
    5             walmart.uk        walmart
    6           michigan.edu       michigan
    7    tkoutletstore.co.uk  tkoutletstore
    8    tillyandotto.com.au   tillyandotto
    

    【讨论】:

    • 虽然它不是万无一失的,但这将返回最正确的答案,因为通常前缀和后缀很小,所以这应该可以满足我的需要。谢谢腰带!
    【解决方案2】:

    Pandas 在计算方面不会让事情变得更快。这个正则表达式可能对你有用:

    s.str.extract(r'(\w+)(\.\w{2,3})+$')[0]
    

    但更好的解决方案是:Extract domain from URL in python

    【讨论】:

    • 这太棒了!我希望我知道更多的正则表达式来更多地利用它,是的,所以对于上面的案例看起来不错,如果我看到任何其他事故,我会在这里发表评论,但我认为这应该可以解决用例。
    • 在这个域 myga.siteip.info 上拍它坏了,它只是在应用正则表达式后使整个事情变为空
    • \w{2,3} 更改为 \w{2,4} 应该可以修复它,因为 info 是 4 个字母。
    • 是的,我想我可能会在 Sash 的回答中花费最长的时间,因为我不确定后缀是什么,它可能是 .com、.net、.info 或 .domain 等。谢谢尽管!很有帮助!
    【解决方案3】:

    这应该可行:

    df['col'] = df['col'].str.rsplit('.', n=1).str[0].str.split('.').str[-1]
    

    输出:

    >>> df
               col
    0  common_name
    1       amazon
    2       amazon
    3       amazon
    4      walmart
    5      walmart
    6     michigan
    

    【讨论】:

    • 对于这些示例 tkoutletstore.co.uktillyandotto.com.au 它返回中间部分 co 和 com
    • 是的,这很棘手。我们应该如何确定取哪个部分?是否可以删除所有少于 4 个字符的部分?
    • 是的,这就是让我心慌的部分.. 有没有办法迭代 .我们可以取 n-1n 个元素吗?因为无论它有子域还是主域,它总是会给出正确的结果。 walmart.com com(n) walmart(n-1) www.walmart.com com(n) walmart(n-1) www (n-2) 希望这个逻辑是有道理的。
    • 那你在说什么? “.”的第 n 个元素是什么意思?
    • 啊我明白你现在在说什么了.. 拍摄这很难。
    猜你喜欢
    • 1970-01-01
    • 2020-03-12
    • 2021-04-15
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多