2016-12-02 30 views
5

Mam naprawdę proste Pandasdataframe, gdzie każda komórka zawiera listę. Chciałbym podzielić każdy element listy na własną kolumnę. Mogę to zrobić, eksportując wartości, a następnie tworząc nowe dataframe. Nie wydaje się to dobrym sposobem, aby to zrobić szczególnie, jeśli mój dataframe miał kolumnę od kolumny listy.Dzielenie listy w komórce Pandy na wiele kolumn

import pandas as pd 

df = pd.DataFrame(data=[[[8,10,12]], 
         [[7,9,11]]]) 

df = pd.DataFrame(data=[x[0] for x in df.values]) 

Pożądany wyjściowa:

0 1 2 
0 8 10 12 
1 7 9 11 

Follow-up oparty na @Psidom odpowiedź:

Gdybym miał drugą kolumnę:

df = pd.DataFrame(data=[[[8,10,12], 'A'], 
         [[7,9,11], 'B']]) 

Jak mogę nie luźny druga kolumna?

Pożądany wyjściowa:

0 1 2 3 
0 8 10 12 A 
1 7 9 11 B 
+2

'df [0] .apply (pd.Series)' działa na Twój przykład. – Psidom

+0

@Psidom perfect! dlaczego nie przesłać jako odpowiedzi. – user2242044

Odpowiedz

7

Można pętli serii z apply() funkcji i przekształcić każdą listę Series, to automatycznie rozwinąć listę jako seria w kierunku kolumny:

df[0].apply(pd.Series) 

# 0 1 2 
#0 8 10 12 
#1 7 9 11 

Aktualizacja: Aby zachować inne kolumny ramki danych, można połączyć wyniki z kolumnami, które chcesz zachować:

pd.concat([df[0].apply(pd.Series), df[1]], axis = 1) 

# 0 1 2 1 
#0 8 10 12 A 
#1 7 9 11 B 
+0

Jak mogę nie stracić dodatkowej kolumny (zmodyfikowane oryginalne pytanie)? – user2242044

+0

Potrzebujesz metody 'pd.concat()'. Zobacz aktualizację! – Psidom

1

Można zrobić pd.DataFrame(df[col].values.tolist()) - jest znacznie szybsze ~ 500X

In [820]: pd.DataFrame(df[0].values.tolist()) 
Out[820]: 
    0 1 2 
0 8 10 12 
1 7 9 11 

In [821]: pd.concat([pd.DataFrame(df[0].values.tolist()), df[1]], axis=1) 
Out[821]: 
    0 1 2 1 
0 8 10 12 A 
1 7 9 11 B 

Timings

Średni

In [828]: df.shape 
Out[828]: (20000, 2) 

In [829]: %timeit pd.DataFrame(df[0].values.tolist()) 
100 loops, best of 3: 15 ms per loop 

In [830]: %timeit df[0].apply(pd.Series) 
1 loop, best of 3: 4.06 s per loop 

Duży

In [832]: df.shape 
Out[832]: (200000, 2) 

In [833]: %timeit pd.DataFrame(df[0].values.tolist()) 
10 loops, best of 3: 161 ms per loop 

In [834]: %timeit df[0].apply(pd.Series) 
1 loop, best of 3: 40.9 s per loop