pandas 按最后一个字符串和字符串值拆分列- python

cnh2zyt3  于 6个月前  发布在  Python
关注(0)|答案(1)|浏览(77)

我试图通过最后一个' - 'AND后跟所有字符串字母来拆分列。

它可能不一定是孤立的最后一个字符串。但它将是所有字符串之前的最后一个字符串

我可以根据第一个/最后一个问题找到单独的问题,但不能组合。
下面,我有一个包含各种组合的Value的df。我想把col分成两个单独的列,其中,最后一个' - '和x1字母之前的所有内容。
我得到了正确的Last列,但不是First列。

df = pd.DataFrame({
   'Value': ['Juan-Diva - HOLLS', 'Carlos - George - ESTE BAN - BOM', 'Javier Plain - Hotham Ham - ALPINE', 'Yul - KONJ KOL MON'],
   })

字符串
备选案文1)

df[['First', 'l']] = df['Value'].str.split(' - ', n=1, expand=True)

df['Last'] = df['Value'].str.split('- ').str[-1]


备选案文2)

# Regular expression pattern
pattern = r'^(.*) - ([A-Z\s]+)$'

# Extract groups into two new columns
df[['First', 'Last']] = df['Value'].str.extract(pattern)


备选案文3)

df[["First", "Last"]] = df["Value"].str.rsplit(" - ", n=1, expand=True)


这些选项都不会返回预期的输出。
预期输出:

First            Last
0                  Juan-Diva           HOLLS
1            Carlos - George  ESTE BAN - BOM
2  Javier Plain - Hotham Ham          ALPINE
3                        Yul    KONJ KOL MON


正则表达式:

df[["First", "Last"]] = df["Value"].str.extract(r'(.*?)\s*-\s*([A-Z]+(?:\s*-?\s*[A-Z]+)*)')
Value         First          Last
0                   Juan-Diva - HOLLS          Juan             D
1    Carlos - George - ESTE BAN - BOM        Carlos             G
2  Javier Plain - Hotham Ham - ALPINE  Javier Plain             H
3                  Yul - KONJ KOL MON           Yul  KONJ KOL MON

的字符串

svujldwt

svujldwt1#

这里使用str.extract

df[["First", "Last"]] = df["Value"].str.extract(r'(.*?)\s*-\s*([A-Z]+(?:\s*-?\s*[A-Z]+)*)$')

字符串

Demo

上面的例子使用str.extract的2/multicolumn版本。它捕获第一个捕获组中的第一个名字。它匹配直到找到最近的连字符,后跟所有大写字母。然后它匹配第二个捕获组中的最后一个名字。

相关问题