如何在 pandas 系列中使用多个分隔符并分成多行
How to use multiple separators in a pandas Series and split into multiple rows
我有一个这样的数据框。
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
我正在尝试根据我的分隔符将 Name 系列分成多行。我可以拆分但也无法保留分隔符。
separators = ["inc","corp","llc"]
我的预期输出是,
Name id
ABC LLC 101
RAM corp 101
IJK Inc 102
请帮忙,谢谢。
您可以使用 str.findall
查找列 Name
中所有匹配正则表达式模式的出现,然后将这些匹配出现分配给列 Name
和 explode
Name
上的数据框:
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
有点冗长的方法,用逗号替换单词后的空格,然后拆分:
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
我有一个这样的数据框。
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
我正在尝试根据我的分隔符将 Name 系列分成多行。我可以拆分但也无法保留分隔符。
separators = ["inc","corp","llc"]
我的预期输出是,
Name id
ABC LLC 101
RAM corp 101
IJK Inc 102
请帮忙,谢谢。
您可以使用 str.findall
查找列 Name
中所有匹配正则表达式模式的出现,然后将这些匹配出现分配给列 Name
和 explode
Name
上的数据框:
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
有点冗长的方法,用逗号替换单词后的空格,然后拆分:
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