2017-10-29 1 views
-1

Ich habe die folgende Spalte in Pandas Datenrahmen: enter image description herePandas Datenrahmen hinzufügen Spalte Basierend auf einem String

In der „Statistik“ Spalte, jede Statistik durch Leerzeichen getrennt. Ich möchte für jede Statistik neue Spalten erstellen. Das Problem ist, dass nicht jede Zeile jede Art von Stat hat. Z.B. Zeile 2 hat kein "trey" drin. Wie vollbringe ich dieses Kunststück?

Ich versuchte dies, aber es hat nur neue Spalten nach jedem ' ‚:

nba_2017_revised4 = nba_2017_revised3.join(nba_2017_revised3['Stats'].str.split(' ', 7, expand=True).rename(columns={0:'Points', 1:'Rebounds', 2:'Assists', 3:'Steals', 4:'Turnovers', 5:'3_Pointers', 6:'FG_Attempts', 7:'FT_Attempts'})) 

enter image description here

 
Date First Last Stats Minutes DKP Team Opp DRPM 
0 20170412.0 Ron Baker 8pt 1rb 4as 2to 1trey 3-6fg 1-2ft 29.350000 14.75 nyk phi -0.56 
1 20170409.0 Ron Baker 11pt 8rb 8as 1st 2to 1trey 5-12fg 38.100000 34.50 nyk tor -0.56 
2 20170407.0 Ron Baker 2pt 2rb 7as 1to 1-7fg 30.500000 14.50 nyk mem -0.56 
3 20170406.0 Ron Baker 12pt 2rb 2as 2to 5-9fg 2-2ft 27.166667 16.50 nyk was -0.56 
4 20170404.0 Ron Baker 9pt 4rb 6as 2st 4to 1trey 4-7fg 0-1ft 37.300000 25.50 nyk chi -0.56 

Dank.

+4

Keine Bilder bitte fügen Sie die Daten in Form von Text. Wie können wir die Daten kopieren, um unsere Lösung zu testen? – Dark

+0

Wie lautet die erwartete Ausgabe? – Dark

+0

nba_2017_revised4 = nba_2017_revised.name (nba_2017_revised3 ['Stats']. Str.split ('', 7, expand = True) .rename (Spalten = {0: 'Points', 1: 'Rebounds' , 2: 'Assists', 3: 'Steals', 4: 'Umsatz', 5: '3_Pointers', 6: 'FG_Attempts', 7: 'FT_Attempts'})) –

Antwort

1

Ich würde Regex verwenden, um jede Aufteilung zu analysieren, indem Sie die fortlaufenden Buchstaben am Ende als die Spaltenwerte und die Zeichenfolge als den vorherigen Wert nehmen.

import pandas as pd 
import re 

pat = lambda x: re.match('^(.+?)([a-z]+)$', x).groups() 
prs = lambda s: pd.Series(*zip(*[pat(x) for x in s.split()])) 

df.drop('Stats', 1).join(df.Stats.apply(prs)) 

     Date First Last Minutes DKP Team Opp DRPM as fg ft pt rb st to trey 
0 20170412 Ron Baker 29.350000 14.75 nyk phi -0.56 4 3-6 1-2 8 1 NaN 2 1 
1 20170409 Ron Baker 38.100000 34.50 nyk tor -0.56 8 5-12 NaN 11 8 1 2 1 
2 20170407 Ron Baker 30.500000 14.50 nyk mem -0.56 7 1-7 NaN 2 2 NaN 1 NaN 
3 20170406 Ron Baker 27.166667 16.50 nyk was -0.56 2 5-9 2-2 12 2 NaN 2 NaN 
4 20170404 Ron Baker 37.300000 25.50 nyk chi -0.56 6 4-7 0-1 9 4 2 4 1 
+0

Ich war aufgeregt, Ihre Ergebnisse zu sehen, piRSquared, aber ich habe den folgenden Fehler beim Versuch, den Code: AttributeError: 'float' Objekt hat kein Attribut 'Split' –

+0

@ GilO'Brien Das ist, weil einige Ihrer Werte in der 'Stats' Spalte sind 'np.nan', die als' float' definiert sind. Sie sollten na-Werte mit "" füllen. Probieren Sie dieses 'df.drop ('Stats', 1) .join (df.Stats.fillna (''). Apply (prs))' – piRSquared

+1

Es hat funktioniert! Ich schulde dir ein Bier! –

Verwandte Themen