Как я могу разделить столбцы с помощью регулярных выражений, чтобы переместить конечные CAPS в отдельный столбец? - PullRequest
11 голосов
/ 07 января 2020

Я пытаюсь разбить столбец с помощью регулярных выражений, но, похоже, не могу правильно получить разбиение. Я пытаюсь взять все конечные буквы и перенести их в отдельный столбец. Таким образом, я получаю все CAPS, которые являются 2-4 CAPS подряд. Тем не менее, он только покидает столбец '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

Ответы [ 2 ]

9 голосов
/ 07 января 2020

Вы можете извлечь данные в два столбца, используя регулярное выражение, например ^(.*?)([A-Z]+)$ или ^(.*[^A-Z])([A-Z]+)$:

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

Это будет сохранять все до последнего символа, который не является заглавной буквой в группе «Имя» и последние заглавные буквы в группе «Команда».

См. regex demo # 1 и regex demo # 2

Подробности

  • ^ - начало строки
  • (.*?) - Группа захвата 1: любой ноль или более символов, кроме символов разрыва строки, всего несколько возможный или
  • (.*[^A-Z]) - любой ноль или более символов, кроме символов разрыва строки, как можно больше, вплоть до последнего символа, который не является заглавной буквой ASCII (при условии совпадения последующих шаблонов) (обратите внимание, что этот шаблон подразумевает, что перед последними заглавными буквами стоит как минимум 1 символ)
  • ([A-Z]+) - Группа захвата 2: одна или несколько заглавных букв ASCII
  • $ - конец строки.
1 голос
/ 07 января 2020

Я сделал несколько изменений в функциях. Возможно, вам потребуется добавить re package.

Это немного вручную, но я надеюсь, что этого будет достаточно. Хорошего дня!

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...