Rompere una riga in righe muliple base al contenuto (stringa) di una colonna

voti
0

Una colonna di mia dataframe ha un numero variabile di \ns all'interno del suo contenuto e devo ogni riga per essere una singola riga sul dataframe finale.

Questo è un esempio minimo:

df = pd.DataFrame({'a': ['x', 'y'], 'b':['line 1\nline 2\nline 3', 'line 1' ]})

Che produce questo dataframe di partenza:

    a   b
0   x   line 1\nline 2\nline 3
1   y   line 1 

Voglio che diventi come questo:

    a   b
0   x   line 1
1   x   line 2
2   x   line 3
3   y   line 1

Ho visto v'è una costruito in funzione che converte ogni patternad una nuova colonna con il str.extractcomando di seguito, per esempio, questo è quello che provato:

df['b'].str.extract(pat='(.*)\n(.*)', expand=True)

Che produce un'uscita alquanto interessante:

    0       1
0   line 1  line 2
1   NaN     NaN

Ma questa non è una soluzione praticabile, perché i dati è suddiviso su colonne e non le righe, non tutti i modelli abbinati e non è chiaro come rimetterlo sul dataframe originale al suo posto e l'ordine. L'ordine delle voci è rilevante da preservare, anche se il dataframe indexnon è.

Al fine di catturare tutti i modelli, sarebbe possibile fare questo:

df['b'].transform(lambda x: x.split('\n'))

Che produce questa uscita:

0    [line 1, line 2, line 3]
1                    [line 1]

Ma ancora una volta, non vedo un modo per fare progressi da questo allo stato desiderato.

È pubblicato 10/10/2019 alle 00:50
fonte dall'utente
In altre lingue...                            


1 risposte

voti
2

Provare a utilizzare str.spliteexplode

df = df.set_index('a').b.str.split('\\n').explode().reset_index()

Out[153]:
   a       b
0  x  line 1
1  x  line 2
2  x  line 3
3  y  line 1
Risposto il 10/10/2019 a 00:55
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more