ฉันจะแยกคอลัมน์ด้วย regex เพื่อย้าย CAPS ต่อท้ายไปยังคอลัมน์แยกได้อย่างไร


11

ฉันพยายามแบ่งคอลัมน์โดยใช้ regex แต่ไม่สามารถแยกได้อย่างถูกต้อง ฉันพยายามใช้ CAPS ต่อท้ายทั้งหมดและย้ายไปไว้ในคอลัมน์แยกกัน ดังนั้นฉันจะได้รับแคปทั้งหมดที่มี 2-4 แคปติดต่อกัน อย่างไรก็ตามจะเป็นเพียงการออกจาก'Name'คอลัมน์ในขณะที่'Team'คอลัมน์ว่างเปล่า

นี่คือรหัสของฉัน:

import pandas as pd

url = "https://www.espn.com/nba/stats/player/_/table/offensive/sort/avgAssists/dir/desc"

df = pd.read_html(url)[0].join(pd.read_html(url)[1])
df[['Name','Team']] = df['Name'].str.split('[A-Z]{2,4}', expand=True)  

ฉันต้องการสิ่งนี้:

print(df.head(5).to_string())
   RK             Name POS  GP   MIN   PTS  FGM   FGA   FG%  3PM  3PA   3P%  FTM  FTA   FT%  REB   AST  STL  BLK   TO  DD2  TD3    PER
0   1  LeBron JamesLA  SF  35  35.1  24.9  9.6  19.7  48.6  2.0  6.0  33.8  3.7  5.5  67.7  7.9  11.0  1.3  0.5  3.7   28    9  26.10
1   2   Ricky RubioPHX  PG  30  32.0  13.6  4.9  11.9  41.3  1.2  3.7  31.8  2.6  3.1  83.7  4.6   9.3  1.3  0.2  2.5   12    1  16.40
2   3   Luka DoncicDAL  SF  32  32.8  29.7  9.6  20.2  47.5  3.1  9.4  33.1  7.3  9.1  80.5  9.7   8.9  1.2  0.2  4.2   22   11  31.74
3   4   Ben SimmonsPHIL  PG  36  35.4  14.9  6.1  10.8  56.3  0.1  0.1  40.0  2.7  4.6  59.0  7.5   8.6  2.2  0.7  3.6   19    3  19.49
4   5    Trae YoungATL  PG  34  35.1  28.9  9.3  20.8  44.8  3.5  9.4  37.5  6.7  7.9  85.0  4.3   8.4  1.2  0.1  4.8   11    1  23.47

เพื่อเป็นสิ่งนี้:

print(df.head(5).to_string())
   RK             Name    Team    POS  GP   MIN   PTS  FGM   FGA   FG%  3PM  3PA   3P%  FTM  FTA   FT%  REB   AST  STL  BLK   TO  DD2  TD3    PER
0   1  LeBron James        LA    SF  35  35.1  24.9  9.6  19.7  48.6  2.0  6.0  33.8  3.7  5.5  67.7  7.9  11.0  1.3  0.5  3.7   28    9  26.10
1   2   Ricky Rubio        PHX    PG  30  32.0  13.6  4.9  11.9  41.3  1.2  3.7  31.8  2.6  3.1  83.7  4.6   9.3  1.3  0.2  2.5   12    1  16.40
2   3   Luka Doncic        DAL    SF  32  32.8  29.7  9.6  20.2  47.5  3.1  9.4  33.1  7.3  9.1  80.5  9.7   8.9  1.2  0.2  4.2   22   11  31.74
3   4   Ben Simmons        PHIL    PG  36  35.4  14.9  6.1  10.8  56.3  0.1  0.1  40.0  2.7  4.6  59.0  7.5   8.6  2.2  0.7  3.6   19    3  19.49
4   5    Trae Young        ATL    PG  34  35.1  28.9  9.3  20.8  44.8  3.5  9.4  37.5  6.7  7.9  85.0  4.3   8.4  1.2  0.1  4.8   11    1  23.47

คำตอบ:


9

คุณสามารถแยกข้อมูลออกเป็นสองคอลัมน์โดยใช้ regex like ^(.*?)([A-Z]+)$หรือ^(.*[^A-Z])([A-Z]+)$:

df[['Name','Team']] = df['Name'].str.extract('^(.*?)([A-Z]+)$', expand=True)

สิ่งนี้จะรักษาตัวอักษรตัวสุดท้ายที่ไม่ใช่ตัวพิมพ์ใหญ่ในกลุ่ม "ชื่อ" และตัวอักษรตัวพิมพ์ใหญ่ตัวสุดท้ายในกลุ่ม "ทีม"

ดูการสาธิต regex # 1และการสาธิต regex # 2

รายละเอียด

  • ^ - เริ่มต้นของสตริง
  • (.*?)- การจับกลุ่มที่ 1: ศูนย์ใด ๆ หรือตัวอักษรอื่น ๆ กว่าตัวอักษรเส้นแบ่งไม่กี่เท่าที่เป็นไปได้
    หรือ
  • (.*[^A-Z]) - ใด ๆ ที่เป็นศูนย์หรือมากกว่าตัวอักษรอื่น ๆ นอกเหนือจากตัวแบ่งบรรทัดให้มากที่สุดจนถึงตัวอักษรตัวสุดท้ายที่ไม่ใช่ตัวอักษรตัวพิมพ์ใหญ่ ASCII (ได้รับการจับคู่รูปแบบที่ตามมา) (โปรดทราบว่ารูปแบบนี้หมายถึงอย่างน้อย 1 ตัวอักษรก่อน อักษรตัวพิมพ์ใหญ่ตัวสุดท้าย)
  • ([A-Z]+) - การจับภาพกลุ่ม 2: ตัวอักษรตัวพิมพ์ใหญ่ ASCII หนึ่งตัวหรือมากกว่า
  • $ - จุดสิ้นสุดของสตริง

1

ฉันได้ทำการเปลี่ยนแปลงเล็กน้อยในฟังก์ชั่นคุณอาจต้องเพิ่มแพ็คเกจใหม่

มันเป็นคู่มือเล็กน้อย แต่ฉันหวังว่ามันจะพอเพียง ขอให้มีความสุขมาก ๆ ในวันนี้!

df_obj_skel = dict()
df_obj_skel['Name'] = list()
df_obj_skel['Team'] = list()
for index,row in df.iterrows():
    Name = row['Name']
    Findings = re.search('[A-Z]{2,4}$', Name)
    Refined_Team = Findings[0]
    Refined_Name = re.sub(Refined_Team + "$", "", Name)
    df_obj_skel['Team'].append(Refined_Team)
    df_obj_skel['Name'].append(Refined_Name)
df_final = pd.DataFrame(df_obj_skel)
print(df_final)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.