4 回答

TA貢獻1725條經驗 獲得超8個贊
pandas Series str.extract 方法就是您所尋找的。該正則表達式適用于您提出的所有情況,盡管可能還有一些其他邊緣情況。
df = pd.DataFrame({
"bad_col": ["Lamar JacksonL. Jackson BAL", "Patrick Mahomes IIP. Mahomes KC",
"Dak PrescottD. Prescott DAL", "Josh AllenJ. Allen BUF",
"Josh AllenJ. Allen SEA", "Anthony McFarland Jr.A. McFarland PIT"],
})
print(df)
bad_col
0 Lamar JacksonL. Jackson BAL
1 Patrick Mahomes IIP. Mahomes KC
2 Dak PrescottD. Prescott DAL
3 Josh AllenJ. Allen BUF
4 Josh AllenJ. Allen SEA
5 Anthony McFarland Jr.A. McFarland PIT
pattern = r"(?P<full_name>.+)(?=[A-Z]\.)(?P<short_name>[A-Z]\.\s.*)\s(?P<team>[A-Z]+)"
new_df = df["bad_col"].str.extract(pattern, expand=True)
print(new_df)
full_name short_name team
0 Lamar Jackson L. Jackson BAL
1 Patrick Mahomes II P. Mahomes KC
2 Dak Prescott D. Prescott DAL
3 Josh Allen J. Allen BUF
4 Josh Allen J. Allen SEA
5 Anthony McFarland Jr. A. McFarland PIT
分解該正則表達式:
(?P<full_name>.+)(?=[A-Z]\.)(?P<short_name>[A-Z]\.\s.*)\s(?P<team>[A-Z]+)
(?P<full_name>.+)(?=[A-Z]\.)
捕獲任何字母,直到我們看到大寫字母后跟句號/句號,我們使用前瞻 (?=...) 來不消耗大寫字母和句號,因為字符串的這一部分屬于短名稱(?P<short_name>[A-Z]\.\s.*.)\s
捕獲一個大寫字母(玩家的第一個首字母),然后是句號(第一個首字母后面的句點),然后是一個空格(第一個首字母和姓氏之間),然后是所有字符,直到我們點擊空格(玩家的姓氏) )。該空間不包含在捕獲組中。(?P<team>[A-Z]+)
捕獲字符串中所有剩余的大寫字母(最終成為玩家團隊)
您可能已經注意到,我使用了由 (?Ppattern) 結構表示的命名捕獲組。在 pandas 中,捕獲組的名稱將成為列的名稱,該組中捕獲的任何內容將成為該列中的值。
現在將新的數據框加入到我們原來的數據框中,完成一圈:
df = df.join(new_df)
print(df)
bad_col full_name short_name \
0 Lamar JacksonL. Jackson BAL Lamar Jackson L. Jackson
1 Patrick Mahomes IIP. Mahomes KC Patrick Mahomes II P. Mahomes
2 Dak PrescottD. Prescott DAL Dak Prescott D. Prescott
3 Josh AllenJ. Allen BUF Josh Allen J. Allen
4 Josh AllenJ. Allen SEA Josh Allen J. Allen
5 Anthony McFarland Jr.A. McFarland PIT Anthony McFarland Jr. A. McFarland
team
0 BAL
1 KC
2 DAL
3 BUF
4 SEA
5 PIT

TA貢獻1779條經驗 獲得超6個贊
我的猜測是短名稱不會包含句號。因此,您可以搜索從行尾開始的第一個句號。因此,從句號之前的一個字符到第一個空格都是您的簡稱。句點前一個字母之前的任何內容都將是全名。

TA貢獻1846條經驗 獲得超7個贊
這可能會有所幫助。
import re
name = 'Anthony McFarland Jr.A. McFarland PIT'
short_name = re.findall(r'(\w\.\s[\w]+)\s[\w]{3}', name)[0]
full_name = name.replace(short_name, "")[:-4]
team = name[-3:]
print(short_name)
print(full_name)
print(team)
輸出:
A. McFarland
Anthony McFarland Jr.
PIT

TA貢獻1818條經驗 獲得超3個贊
import pandas as pd
import numpy as np
df = pd.DataFrame({'players':['Lamar JacksonL. Jackson BAL', 'Patrick Mahomes IIP. Mahomes KC',
'Anthony McFarland Jr.A. McFarland PIT']})
def splitName(name):
last_period_pos = np.max(np.where(np.array(list(name)) == '.'))
full_name = name[:(last_period_pos - 1)]
short_name_team = name[(last_period_pos - 1):]
team_pos = np.max(np.where(np.array(list(short_name_team)) == ' '))
short_name = short_name_team[:team_pos]
team = short_name_team[(team_pos + 1):]
return full_name, short_name, team
df['full_name'], df['short_name'], df['team'] = zip(*df.players.apply(splitName))
添加回答
舉報