2016-10-16 2 views
1

Der df ist der Datenrahmen, der die folgenden Informationen enthält.Wie spalten Sie eine Spalte in andere Spalten, die in einem Datenframe gespeichert sind?

In [61]: df.head() 
    Out[61]: 
     id movie_id     info 
    0 1   1 Italy:1 January 1994 
    1 2   2 USA:22 January 2006 
    2 3   3 USA:12 February 2006 
    3 4   4 USA:February 2006 
    4 5   5 USA:2006 

Ich möchte eine Ausgabe wie folgt:

In [61]: df.head()  
Out[61]: 
    id movie_id country Date Month Year 
0 1   1 Italy 1  January 1994 
1 2   2 USA  22 January 2006 
2 3   3 USA  12 February 2006 
3 4   4 USA  None February 2006 
4 5   5 USA  None None  2006 

Die Daten in Datenrahmen gespeichert ist, und es muss in den Datenrahmen überschrieben werden.

+1

zeigen uns, was Sie versucht –

+0

eine Funktion (s) Schreiben Sie, dass die Stücke dann weisen Sie den Rückgabewert dieser Funktion (en) in eine neue Spalte extrahieren/aufspalten und zurück - vielleicht verwenden [Dataframe.apply oder .applymap] (http://pandas.pydata.org/pandas-docs/stable/api.html#id5). – wwii

Antwort

2

Sie regex verwenden können :|\s+ die Spalte auf beiden Semikolon oder weißen Flächen und geben Sie den expand Parameter aufzuspalten um wahr zu sein, so dass das Ergebnis Spalten erweitern:

df[["country","Date","Month","Year"]] = df['info'].str.split(':|\s+', expand = True) 

enter image description here

-Update:

Um optionale fehlende Daten und Monate zu behandeln, könnten Sie versuchen extract mit regulären Ausdruck ITZUNG:

(df[["country","Date","Month","Year"]] = 
    df['info'].str.extract('^([A-Za-z]+):(\d{1,2})? ?([A-Za-z]+)? ?(\d{4})$')) 
  • ^([A-Za-z]+):(\d{1,2})? ?([A-Za-z]+)? ?(\d{4})$' enthält vier capture Gruppen country, Date, Month, Year entsprechend jeweils;
  • ^ und $ bezeichnen den Anfang und das Ende der Zeichenfolge;
  • ([A-Za-z]+) erfasst das Land, das vor : ist und besteht aus Buchstaben;
  • (\d{1,2}) erfasst Datum, das aus ein oder zwei Ziffern besteht, aber optional (mit ? nach der Gruppe), d. H. Könnte fehlen;
  • ([A-Za-z]+) erfasst Monat, der aus Buchstaben besteht und als optional markiert ist mit ?;
  • (\d{4}) erfasst das Jahr, das aus vier Ziffern besteht;

enter image description here

+0

einige Daten fehlen in info wie info enthält nur ** USA: 2013 **. Dies kann innerhalb des Landes und Jahres dargestellt werden, aber die ** 2013 ** ist unter ** Datum ** Spalte. Kannst du es durch Umkehrung oder durch irgendeine andere Methode tun? –

+0

In [17]: Datenrahmen [['Jahr', 'Monat', 'Tag']] = Datenrahmen ['Freigabe']. Apply ( Lambda x: pd.Series (x.split() [:: - 1 ])) –

+0

Ich versuchte oben Code, um mein Problem zu lösen, aber der Name und das Datum des Landes kommen in Spalte. –

1

Mit split String-Methode.

In [163]: df[['country', 'date', 'month', 'year']] = df['info'].str.split('\W+', expand=True) 

In [164]: df 
Out[164]: 
    id movie_id     info country date  month year 
0 1   1 Italy:1 January 1994 Italy 1 January 1994 
1 2   2 USA:22 January 2006  USA 22 January 2006 
2 3   3 USA:12 February 2006  USA 12 February 2006 
3 4   4 USA:19 February 2006  USA 19 February 2006 
4 5   5 USA:22 January 2006  USA 22 January 2006 
+0

Das funktioniert sehr gut, aber ich habe ein Problem mehr in diesem, das ist: –

+0

einige Daten fehlen von Info das ist: Info enthält nur 'Italien: 2013' nach der Aufteilung der ** 2013 ** wird unter ** Datum * Spalte angezeigt und ** Monat, Jahr ist keines **. Wie behebt man dieses Problem? –

+0

Sie müssten benutzerdefinierte Funktion schreiben. Hinweis: http: // Stackoverflow.com/a/40069615/2137255 – Zero

Verwandte Themen