pandas 用异常替换列中的部分字符串

z9gpfhce  于 2023-01-28  发布在  其他
关注(0)|答案(2)|浏览(135)

我正在做一个数据清理Jupyter笔记本与Pandas,我试图得到只是字符串的第一部分。但有一个陷阱。我可以很容易地删除表达式的其余部分,但有些字段实际上是有效的。因此,例如在列:
| 装运_供应商|
| - ------|
| 美国石油公司|
| Usps国际|
| 乌斯普西3|
| 乌斯普西丘|
| 使用者|
所以我想保持Usps和Usps的国际化。到目前为止,我使用了以下代码来处理简单的挑战:

orders.loc[:, 'SHIPMENT_PROVIDER'] = orders.loc[:, 'SHIPMENT_PROVIDER'].replace(to_replace='(?:Usps)([a-zA-Z0-9]+)$', value = 'Usps', regex = True)

但是这对于两个可替换的表达式是不起作用的。因此,带有一些随机字符的Usps,例如(Uspsxyz),应该替换为Usps,但是带有一些随机字符的Usps International,例如(Usps Internationalxyz),应该替换为Usps International。

lnlaulya

lnlaulya1#

其他人已经发布了正则表达式解决方案。那么非正则表达式解决方案呢?

s = orders["SHIPMENT_PROVIDER"]
orders["SHIPMENT_PROVIDER"] = np.select(
    [s.str.startswith("Usps International"), s.str.startswith("Usps")],
    ["Usps International", "Usps"],
    s,
)
y1aodyip

y1aodyip2#

作为一种模式,您可以将捕获组用于第一部分,而不是将可选部分用于国际部分

^(Usps)(?: International)?[a-zA-Z0-9]+$

在更换中,使用组1。
Regex demo

import pandas as pd

pattern = r"^(Usps)(?: International)?[a-zA-Z0-9]+$"

items = [
    "Usps",
    "Usps International",
    "Uspsxy3",
    "Usps7kju",
    "Usps0by",
    "Usps Internationalxyz"
]

orders = pd.DataFrame(items, columns=["SHIPMENT_PROVIDER"])
orders.loc[:, 'SHIPMENT_PROVIDER'] = orders.loc[:, 'SHIPMENT_PROVIDER'].replace(r"^(Usps)(?: International)?[a-zA-Z0-9]+$", r"\1", regex=True)
print(orders)

产出

SHIPMENT_PROVIDER
0                Usps
1  Usps International
2                Usps
3                Usps
4                Usps
5                Usps

相关问题