2017-02-02 34 views
7

Aşağıdaki Pandalar Dataframe var ki birden çok satırda listelerini içeren bir pandalar sütun: Ben dönüşmesi amacıyla "b" sütununda listeleri "unstack" olacağını nasıl"Yığını kaldır"

df = pd.DataFrame({"a" : [1,2,3], "b" : [[1,2],[2,3,4],[5]]}) 
    a   b 
0 1  [1, 2] 
1 2 [2, 3, 4] 
2 3  [5] 

dataframe:

a b 
0 1 1 
1 1 2 
2 2 2 
3 2 3 
4 2 4 
5 3 5 

cevap

6

GÜNCELLEME: jenerik vectorized yaklaşım - birden sütunlar YF'ların için de çalışacaktır:

biz fo var varsayarak llowing DF:

In [159]: df 
Out[159]: 
    a   b c 
0 1  [1, 2] 5 
1 2 [2, 3, 4] 6 
2 3  [5] 7 

Çözüm:

In [160]: lst_col = 'b' 

In [161]: pd.DataFrame({ 
    ...:  col:np.repeat(df[col].values, df[lst_col].str.len()) 
    ...:  for col in df.columns.difference([lst_col]) 
    ...: }).assign(**{lst_col:np.concatenate(df[lst_col].values)})[df.columns.tolist()] 
    ...: 
Out[161]: 
    a b c 
0 1 1 5 
1 1 2 5 
2 2 2 6 
3 2 3 6 
4 2 4 6 
5 3 5 7 

Kurulumu:

df = pd.DataFrame({ 
    "a" : [1,2,3], 
    "b" : [[1,2],[2,3,4],[5]], 
    "c" : [5,6,7] 
}) 

Vectörize NumPy yaklaşım:

In [124]: pd.DataFrame({'a':np.repeat(df.a.values, df.b.str.len()), 
         'b':np.concatenate(df.b.values)}) 
Out[124]: 
    a b 
0 1 1 
1 1 2 
2 2 2 
3 2 3 
4 2 4 
5 3 5 

ESKİ cevap:

bu deneyin:

In [89]: df.set_index('a', append=True).b.apply(pd.Series).stack().reset_index(level=[0, 2], drop=True).reset_index() 
Out[89]: 
    a 0 
0 1 1.0 
1 1 2.0 
2 2 2.0 
3 2 3.0 
4 2 4.0 
5 3 5.0 

Veya biraz daha güzel bir çözüm provided by @Boud:

In [110]: df.set_index('a').b.apply(pd.Series).stack().reset_index(level=-1, drop=True).astype(int).reset_index() 
Out[110]: 
    a 0 
0 1 1 
1 1 2 
2 2 2 
3 2 3 
4 2 4 
5 3 5 
+0

Hm, sonra append kaldırmak ve seviye -1 damla? – Boud

+0

@Boud, iyi nokta, teşekkürler! Yanıtı – MaxU

+0

Başar'a ekledim, teşekkürler! – Alex