按最后一个分隔符和大写值拆分列[重复]

问题描述 投票:0回答:2

我正在尝试按最后一个

' - '
拆分一列,并且所有字符串字母均为大写。下面,我有一个 df ,其中
Value
包含连接项目的各种组合。我想将列分成两个单独的列。简单来说,就是最后一个
' - '
之前的所有内容。我有
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
python pandas split
2个回答
2
投票

使用Pandas内置的向量化字符串操作

import pandas as pd

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

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

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

# Display the DataFrame
print(df)

输出:

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

在此代码中,正则表达式

r'^(.*) - ([A-Z\s]+)$'
.str.extract()
一起使用。该模式寻找两组:

  1. (.*)
    捕获最后一个“-”之前的所有内容。
  2. ([A-Z\s]+)$
    捕获“ - ”后面的最后一个大写字符串。

然后,

.str.extract()
方法会根据这些捕获组创建一个包含两列的 DataFrame。


使用

re
模块的替代方法

import pandas as pd
import re

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

# Function to split the string
def split_value(s):
    # Find the last occurrence of ' - ' followed by uppercase letters
    match = re.search(r'(.*) - ([A-Z\s]+)$', s)
    if match:
        return match.group(1), match.group(2)
    else:
        return s, None

# Apply the function to each row in 'Value' column
df[['First', 'Last']] = df['Value'].apply(lambda x: split_value(x)).tolist()

print(df)

输出:

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

我正在使用

re.search
函数根据指定模式查找匹配项。图案
r'(.*) - ([A-Z\s]+)$'
与我上面使用的图案相同。如果找到匹配项,该函数将返回字符串的两部分;否则,它返回原始字符串和 'Last' 列的
None
。然后,结果将转换为列表并分配给新列“First”和“Last”。


1
投票

IIUC,你应该使用

.str.rsplit

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

打印:

                                Value                      First          Last
0                   Juan-Diva - HOLLS                  Juan-Diva         HOLLS
1          Carlos - George - ESTE BAN            Carlos - George      ESTE BAN
2  Javier Plain - Hotham Ham - ALPINE  Javier Plain - Hotham Ham        ALPINE
3                  Yul - KONJ KOL MON                        Yul  KONJ KOL MON
© www.soinside.com 2019 - 2024. All rights reserved.