我正在尝试按最后一个
' - '
拆分一列,并且所有字符串字母均为大写。下面,我有一个 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
使用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()
一起使用。该模式寻找两组:
(.*)
捕获最后一个“-”之前的所有内容。([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”。
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