2017-12-29 7 views
2

Ich habe diese Darknet-Daten, und die Daten sind wie folgt: Die Herkunft Spalte enthält mehrere Länder in einer Zeile.Teilen Sie eine Zeichenfolge Leerzeichen getrennt in mehrere Zeilen

df = pd.DataFrame({'Item': ['Weapons', 'Drugs', 'Data'], 'Origin': ['US UK AUS', 'US', 'Canada']}) 

Ich versuche, die erste Zeile in mehrere Zeilen zu konvertieren. In diesem Fall drei!

df = pd.DataFrame({'Item': ['Weapons', 'Weapons', 'Weapons','Drugs', 'Data'], 'Origin': ['US', 'UK', 'AUS', 'US', 'Canada']}) 

Gibt es einen einfachen Code, den ich verwenden könnte?

Wenn das nicht der Fall ist, wie kann ich es möglich machen ??

+0

Wenn Ihre Frage beantwortet wurde, prüfen Sie bitte [Kennzeichnung akzeptiert, ] (https://stackoverflow.com/help/someone-answers). Vielen Dank! –

Antwort

5

Option 1
str.extractall -

df.set_index('Item').Origin\ 
    .str.extractall(r'\b(?P<Origin>\w+)\b')\ 
    .reset_index()\ 
    .drop('match', 1) 

     Item Origin 
0 Weapons  US 
1 Weapons  UK 
2 Weapons  AUS 
3 Drugs  US 
4  Data Canada 

Das Muster extrahiert alle Wörter in einer separaten Zeile -

\b   # word boundary 
(?P<Origin> # named capture group called "Origin" 
\w+   # any string of letters/digits (you can change this to [^\s]+ instead to match punctuation 
)   # closing 1st capture group 
\b   # word boundary 

Beachten Sie, dass Sie ein bisschen mehr Leistung auspressen kann durch die drop Entfernen Rufen Sie an und ersetzen Sie es durch einen del Anruf -

i = df.set_index('Item').Origin\ 
     .str.extractall(r'\b(?P<Origin>\w+)\b')\ 
     .reset_index()\ 

del i['match'] 

Option 2
str.split + stack -

df.set_index('Item').Origin\ 
    .str.split(expand=True)\ 
    .stack()\ 
    .reset_index(level=0, name='Origin') 

     Item Origin 
0 Weapons  US 
1 Weapons  UK 
2 Weapons  AUS 
0 Drugs  US 
0  Data Canada 

Leistung

df = pd.concat([df] * 10000, ignore_index=True) 

%%timeit 
df.set_index('Item').Origin\ 
    .str.extractall(r'\b(?P<Origin>\w+)\b')\ 
    .reset_index()\ 
    .drop('match', 1) 

1 loop, best of 3: 226 ms per loop 

%%timeit 
df.set_index('Item').Origin\ 
    .str.split(expand=True)\ 
    .stack()\ 
    .reset_index(level=0, name='Origin') 

10 loops, best of 3: 142 ms per loop 

Beachten Sie, dass die Leistung auf Ihrem aktuellen Daten unterscheiden sich nach der Art Ihrer Daten basieren könnte, usw.

+0

Ja, klar dupee ... – jezrael

+0

Ich reall nicht wie Signup Dupes, aber was kann ich tun, wenn Sie es wirklich tun wollen? Wenn einfach eine Funktion antwortet, ist es vollkommen in Ordnung, kein Problem, aber wenn du DUPE finden musst, auch wenn es nicht 100% clear oder halb Dupes ist, ist es wirklich schlecht und mag es nicht ... und leider tust du es :(Und ich verstehe nicht warum ... :(:(:(:( – jezrael

+0

Und es ist eine gute Annäherung? Also, wenn Sie langsamer sind, dann finden Sie Betrüger? Es ist schlimmer, wie ich denke :(:(:( – jezrael

Verwandte Themen