4 回答
TA貢獻(xiàn)1725條經(jīng)驗(yàn) 獲得超8個(gè)贊
pandas Series str.extract 方法就是您所尋找的。該正則表達(dá)式適用于您提出的所有情況,盡管可能還有一些其他邊緣情況。
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
分解該正則表達(dá)式:
(?P<full_name>.+)(?=[A-Z]\.)(?P<short_name>[A-Z]\.\s.*)\s(?P<team>[A-Z]+)
(?P<full_name>.+)(?=[A-Z]\.)捕獲任何字母,直到我們看到大寫字母后跟句號(hào)/句號(hào),我們使用前瞻 (?=...) 來(lái)不消耗大寫字母和句號(hào),因?yàn)樽址倪@一部分屬于短名稱(?P<short_name>[A-Z]\.\s.*.)\s捕獲一個(gè)大寫字母(玩家的第一個(gè)首字母),然后是句號(hào)(第一個(gè)首字母后面的句點(diǎn)),然后是一個(gè)空格(第一個(gè)首字母和姓氏之間),然后是所有字符,直到我們點(diǎn)擊空格(玩家的姓氏) )。該空間不包含在捕獲組中。(?P<team>[A-Z]+)捕獲字符串中所有剩余的大寫字母(最終成為玩家團(tuán)隊(duì))
您可能已經(jīng)注意到,我使用了由 (?Ppattern) 結(jié)構(gòu)表示的命名捕獲組。在 pandas 中,捕獲組的名稱將成為列的名稱,該組中捕獲的任何內(nèi)容將成為該列中的值。
現(xiàn)在將新的數(shù)據(jù)框加入到我們?cè)瓉?lái)的數(shù)據(jù)框中,完成一圈:
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貢獻(xiàn)1779條經(jīng)驗(yàn) 獲得超6個(gè)贊
我的猜測(cè)是短名稱不會(huì)包含句號(hào)。因此,您可以搜索從行尾開(kāi)始的第一個(gè)句號(hào)。因此,從句號(hào)之前的一個(gè)字符到第一個(gè)空格都是您的簡(jiǎn)稱。句點(diǎn)前一個(gè)字母之前的任何內(nèi)容都將是全名。
TA貢獻(xiàn)1846條經(jīng)驗(yàn) 獲得超7個(gè)贊
這可能會(huì)有所幫助。
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貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超3個(gè)贊
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))
添加回答
舉報(bào)
