2016-12-02 39 views
5

Her hücrenin bir liste içerdiği gerçekten basit bir Pandasdataframe var. Listenin her bir öğesini kendi sütununa ayırmak istiyorum. Değerleri dışa aktararak ve daha sonra yeni bir dataframe oluşturarak yapabilirim. Bu, özellikle de dataframe benim liste sütunundan bir sütun varsa, bunu yapmak için iyi bir yol gibi görünmüyor.Pandas hücresinde bir listeyi birden çok sütuna bölme

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]) 

İstenilen çıktı:

Ben ikinci bir sütuna sahip yaptıysak:

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

Nasıl I gevşek yok @Psidom Yanıta göre

0 1 2 
0 8 10 12 
1 7 9 11 

Takibi diğer sütun?

İstenilen çıktı:

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

'df [0] .apply (pd.Series)' örneğiniz için çalışır. – Psidom

+0

@Psidom mükemmel! Neden cevap olarak göndermeyiniz. – user2242044

cevap

7

yapabilirsiniz apply() fonksiyonu ile Serisi döngü ve bu otomatik olarak sütun yönünde bir dizi olarak listesini genişletmek, bir Series her liste dönüştürmek:

df[0].apply(pd.Series) 

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

Güncelleştirmesi: Veri çerçevesinin diğer sütunlarını tutmak için sonucu tutmak istediğiniz sütunlarla birleştirebilirsiniz:

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

Ek bir sütunu nasıl kaybedemiyorum (değiştirilmiş orijinal soru)? – user2242044

+0

'pd.concat()' yöntemine gereksiniminiz var. Güncellemeye bakın! – Psidom

1

Sen pd.DataFrame(df[col].values.tolist()) yapabileceğini - ~

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 

Büyük

Orta

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 

Zamanlamaları

daha hızlıdır