如何在 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 中的最后一个句点之后删除字符?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用现有列中的变量创建数据框作为使用 python 的列?
使用 Python,如何按小时对 Dataframe 中的列进行分组?