Zlomit řádek do vícenásobných řad založených na obsahu (String) sloupu

hlasů
0

Jeden sloupec mého datového rámce má proměnný počet \nje uvnitř jeho obsahu a potřebuji každý řádek být na jednom řádku na konečnou datového rámce.

Jedná se o minimální příklad:

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

To vytváří tento výchozí datový rámec:

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

Chci, aby se stal, jako je tento:

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

Viděl jsem, že je vestavěná funkce, který konvertuje každý patternse nový sloupec s str.extractpříkazem níže, například, to je to, co jsem se snažil:

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

Který produkuje poněkud zajímavý výkon:

    0       1
0   line 1  line 2
1   NaN     NaN

Ale to není schůdné řešení, protože data jsou rozdělena na sloupcích a ne řadách, ne všechny vzory uzavřeno a to není jasné, jak dát zpět na původní datovém svém místě a pořádek. Pořadí přihlášek je důležité být zachována, i když dataframe indexnení.

Aby bylo možné zachytit všechny vzory, bylo by možné to udělat:

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

Že získá tento výstup:

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

Ale opět, nevidím způsob, jak dosáhnout pokroku z toho do požadovaného stavu.

Položena 10/10/2019 v 00:50
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
2

Zkuste použít str.splitiexplode

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
Odpovězeno 10/10/2019 v 00:55
zdroj uživatelem

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