如何在 df 列 python 中的最后一个句点之后删除字符?

Posted

技术标签:

【中文标题】如何在 df 列 python 中的最后一个句点之后删除字符?【英文标题】:How to remove characters after last period in df column 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?

【问题讨论】:

【参考方案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+)(\.\w2,3)+$')[0]

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

【讨论】:

这太棒了!我希望我知道更多的正则表达式来更多地利用它,是的,所以对于上面的案例看起来不错,如果我看到任何其他事故,我会在这里发表评论,但我认为这应该可以解决用例。 在这个域 myga.siteip.info 上拍它坏了,它只是在应用正则表达式后使整个事情变为空 \w2,3 更改为 \w2,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 个元素是什么意思? 啊我明白你现在在说什么了.. 拍摄这很难。

以上是关于如何在 df 列 python 中的最后一个句点之后删除字符?的主要内容,如果未能解决你的问题,请参考以下文章

将一列时间戳转换为 pandas 中的句点

如何使用现有列中的变量创建数据框作为使用 python 的列?

使用 Python,如何按小时对 Dataframe 中的列进行分组?

从python中的记录创建列

在 Python 中,如何将字典转换为 df 列,其中键与 df.index 值匹配?

如何在列中划分句点