亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何用大寫字母拆分 pandas 數據框中的字符串

如何用大寫字母拆分 pandas 數據框中的字符串

繁星淼淼 2023-08-15 18:40:19
我正在處理一些 NFL 數據,數據框中有一列,如下所示:0         Lamar JacksonL. Jackson BAL1     Patrick Mahomes IIP. Mahomes KC2         Dak PrescottD. Prescott DAL3              Josh AllenJ. Allen BUF4         Russell WilsonR. Wilson SEA每個單元格中有 3 位信息 - FullName,ShortName我Team希望為其創建新列。預期輸出:         FullName                ShortName        Team0         Lamar Jackson           L. Jackson        BAL1         Patrick Mahomes II      P. Mahomes        KC2         Dak Prescott            D. Prescott       DAL3         Josh Allen              J. Allen          BUF4         Russell Wilson          R. Wilson         SEA我已經設法得到了,Team但我不太確定如何在一行中完成所有這三個操作。我正在考慮通過查找前一個字符來分割字符串,fullstop但是出現了一些名稱,例如:Anthony McFarland Jr.A. McFarland PIT有多個句號。有人知道解決這個問題的最佳方法嗎?謝謝!
查看完整描述

4 回答

?
qq_遁去的一_1

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  


查看完整回答
反對 回復 2023-08-15
?
哆啦的時光機

TA貢獻1779條經驗 獲得超6個贊

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



查看完整回答
反對 回復 2023-08-15
?
喵喵時光機

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


查看完整回答
反對 回復 2023-08-15
?
泛舟湖上清波郎朗

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))


查看完整回答
反對 回復 2023-08-15
  • 4 回答
  • 0 關注
  • 191 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號