2017-02-02 28 views

Odpowiedz

6

UPDATE: generic wektorowy podejście - będzie działać również dla wielu kolumn DFS:

zakładając mamy FO 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 

Rozwiązanie:

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 

Setup:

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

Vectorized NumPy podejście:

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 

odpowiedź OLD:

Spróbuj tego:

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 

Albo nieco ładniejsze rozwiązanie 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, a następnie usunąć append i spadnie poziom -1? – Boud

+0

@Boud, dobra uwaga, dziękuję! Dodałem go do odpowiedzi – MaxU

+0

Awesome, thanks! – Alex