2017-02-02 41 views
7

說我有以下的熊貓數據幀一大熊貓柱:「拆散」包含列表爲多行

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] 

我怎麼會爲了它改造成了「拆散」列表中的「b」列據幀:

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

回答

6

UPDATE:通用的量化方法 - 也將努力爲多列的DF:

假設我們有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 

解決方案:

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 

設置:

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

矢量化NumPy的方法:

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 

OLD答案:

試試這個:

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 

或位更好的解決方案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

嗯,然後刪除追加拖放級-1? – Boud

+0

@很好,謝謝!我已將它添加到答案 – MaxU

+0

真棒,謝謝! – Alex