Làm cách nào tôi có thể tách các cột bằng biểu thức chính quy để di chuyển CAPS thành một cột riêng biệt?


11

Tôi đang cố tách một cột bằng regex, nhưng dường như không thể tách được chính xác. Tôi đang cố lấy tất cả các CAPS trailing và chuyển chúng vào một cột riêng. Vì vậy, tôi nhận được tất cả các CAPS là 2-4 CAPS liên tiếp. Tuy nhiên, nó chỉ để lại 'Name'cột trong khi 'Team'cột trống.

Đây là mã của tôi:

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)  

Tôi muốn điều này:

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

để trở thành này:

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

Câu trả lời:


9

Bạn có thể trích xuất các dữ liệu vào hai cột bằng cách sử dụng một regex như ^(.*?)([A-Z]+)$hay ^(.*[^A-Z])([A-Z]+)$:

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

Điều này sẽ giữ tất cả các ký tự cuối cùng không phải là chữ cái viết hoa trong Nhóm "Tên" và các chữ cái viết hoa cuối cùng trong Nhóm "Nhóm".

Xem bản demo regex # 1bản demo regex # 2

Chi tiết

  • ^ - bắt đầu một chuỗi
  • (.*?)- Chụp nhóm 1: bất kỳ ký tự 0 hoặc nhiều ký tự khác ngoài ký tự ngắt dòng, càng ít càng tốt
    hoặc
  • (.*[^A-Z]) - bất kỳ ký tự 0 hoặc nhiều ký tự khác ngoài ký tự ngắt dòng, càng nhiều càng tốt, cho đến ký tự cuối cùng không phải là chữ cái viết hoa ASCII (được cấp các mẫu tiếp theo khớp) (lưu ý rằng mẫu này ngụ ý có ít nhất 1 ký tự trước chữ in hoa cuối cùng)
  • ([A-Z]+) - Chụp nhóm 2: một hoặc nhiều chữ cái viết hoa ASCII
  • $ - cuối chuỗi.

1

Tôi đã thực hiện một vài thay đổi trong các chức năng, Bạn có thể cần thêm gói lại.

Đó là một chút thủ công, nhưng tôi hy vọng điều này sẽ đủ. Có một ngày tuyệt vời!

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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.