Wie kann ich Spalten mit Regex teilen, um nachfolgende CAPS in eine separate Spalte zu verschieben?

11

Ich versuche, eine Spalte mit Regex zu teilen, kann aber die Aufteilung nicht richtig erhalten. Ich versuche, alle nachfolgenden CAPS in eine separate Spalte zu verschieben. Ich bekomme also alle CAPS, die entweder 2-4 CAPS hintereinander sind. Die Spalte wird jedoch nur verlassen 'Name', wenn die 'Team'Spalte leer ist.

Hier ist mein Code:

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)  

Ich will das:

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

um dies zu werden:

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
chitown88
quelle

Antworten:

9

Sie können die Daten in zwei Spalten extrahieren, indem Sie einen regulären Ausdruck wie ^(.*?)([A-Z]+)$oder verwenden ^(.*[^A-Z])([A-Z]+)$:

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

Dies hält alles bis zum letzten Zeichen, das kein Großbuchstabe in Gruppe "Name" ist, und den letzten Großbuchstaben in Gruppe "Team".

Siehe Regex-Demo Nr. 1 und Regex-Demo Nr. 2

Einzelheiten

  • ^ - Beginn einer Zeichenfolge
  • (.*?)- Erfassen von Gruppe 1: beliebige null oder mehr Zeichen außer Zeilenumbruchzeichen, so wenig wie möglich
    oder
  • (.*[^A-Z]) - Null oder mehr Zeichen außer Zeilenumbruchzeichen, so viele wie möglich, bis zum letzten Zeichen, das kein ASCII-Großbuchstabe ist (vorausgesetzt, die nachfolgenden Muster stimmen überein) (beachten Sie, dass dieses Muster impliziert, dass mindestens 1 Zeichen vor dem Zeichen steht letzte Großbuchstaben)
  • ([A-Z]+) - Erfassen von Gruppe 2: ein oder mehrere ASCII-Großbuchstaben
  • $ - Ende der Zeichenfolge.
Wiktor Stribiżew
quelle
1

Ich habe einige Änderungen an den Funktionen vorgenommen. Möglicherweise müssen Sie ein neues Paket hinzufügen.

Es ist ein bisschen manuell, aber ich hoffe, das wird ausreichen. Ich wünsche ihnen einen wunderbaren Tag!

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