【问题标题】:How to use multiple separators in a pandas Series and split into multiple rows如何在熊猫系列中使用多个分隔符并分成多行
【发布时间】:2021-06-04 22:49:26
【问题描述】:

我有一个这样的数据框。

df = pd.DataFrame({
    "Name" : ["ABC LLC Ram corp", "IJK Inc"],
    "id" : [101, 102]
 })

    Name                id
0 ABC LLC Ram corp      101
1 IJK Inc               102

我正在尝试根据我的分隔符将名称系列拆分为多行。我可以拆分但也无法保留分隔符。

separators = ["inc","corp","llc"]

我的预期输出是,

Name       id
ABC LLC    101
RAM corp   101
IJK Inc    102

请帮忙,谢谢。

【问题讨论】:

    标签: python pandas explode


    【解决方案1】:

    您可以使用str.findallName 列中查找所有匹配的正则表达式模式,然后将这些匹配的匹配项分配给NameexplodeName 上的数据框:

    pat = fr"(?i)(.*?(?:{'|'.join(separators)}))"
    df.assign(Name=df['Name'].str.findall(pat)).explode('Name')
    

    正则表达式详细信息:

    • (?i) :不区分大小写的标志
    • ( : 捕获组开始
    • .*? :匹配除行终止符之外的任何字符,次数在零到无限次之间,尽可能少 (lazy match)。
    • (?: : 非捕获组的开始
    • {'|'.join(separators)}: f-string 表达式,计算结果为 inc|corp|llc
    • ) : 非捕获组结束
    • ) : 捕获组结束

            Name   id
    0    ABC LLC  101
    0   Ram corp  101
    1    IJK Inc  102
    

    【讨论】:

    • 谢谢@subham,如果可能的话,你能解释一下正则表达式吗?
    • @pyd 当然给我一分钟。
    • @pyd 现在您可以检查this link 以查看正则表达式模式的实际作用。与此同时,我将编辑答案以包含详细信息。
    • 嗨@subham,我们如何在 df.assign 中有变量,例如a="Name";df.assign(a,....)
    • 嗨@pyd,我想我们可以简单地做df.assign(a=<some_value>),其中<some_value> 可以是scalarseries,甚至是list,但与数据帧的长度相同。
    【解决方案2】:

    有点冗长的方法,通过用逗号替换单词后的空格然后拆分:

    d = dict(zip([f'{i} ' for i in separators],[f'{i},' for i in separators]))
    #{'inc ': 'inc,', 'corp ': 'corp,', 'llc ': 'llc,'}
    
    out = (df.assign(Name=df['Name'].str.lower()
           .replace(d,regex=True).str.title().str.split(",")).explode("Name"))
    

    print(out)
    
           Name   id
    0   Abc Llc  101
    0  Ram Corp  101
    1   Ijk Inc  102
    

    【讨论】:

    • 感谢您的回答 :) @Anky,但 Subham 答案没有更改为标题大小写,因此符合我的预期输出,不确定性能方面
    猜你喜欢
    • 2021-02-02
    • 1970-01-01
    • 2016-03-14
    • 1970-01-01
    • 2016-08-30
    • 2019-09-30
    • 1970-01-01
    • 2016-08-02
    • 2021-02-06
    相关资源
    最近更新 更多