2017-06-29 472 views
1

這是我的問題。我有一個有x列和y行的數據框。有些列實際上是列表。我想將這些列轉換爲包含單個值的多個列。DataFrame Pandas - 將多列列表展平列

一個例子本身已經說明問題:

我的數據框:

  ans_length ans_unigram_numbers ... levenshtein_dist que_entropy 
0    [19, 14]    [12, 8] ...    9.00  3.189898 
1     [19]    [12] ...    4.00  3.189898 
2     [0]     [0] ...   170.00  4.299996 
3     [0]     [0] ...   170.00  4.303341 
4     [0]     [0] ...   170.00  4.304335 
5     [0]     [0] ...   170.00  4.311820 
28    [56]    [23] ...    24.00  4.110291 
29     [0]     [0] ...    56.00  4.181720 
...    ...     ... ...    ...   ... 
1976    [24]    [11] ...    24.00  3.084963 
1977    [24]    [11] ...    24.00  3.084963 
1992 [31, 24, 32, 28] [14, 15, 17, 11] ...    18.75  3.292770 
1993 [31, 24, 32, 28] [14, 15, 17, 11] ...    18.75  3.292770 

[1998 rows x 9 columns] 

我期待什麼:

ans_length_0 ans_length_1 ans_length_2 ans_length_3 \ 
0    19    14    
1    19     
2    0     
3    0     
4    0     
5    0     
28   56     
29    0     
1976   24     
1977   24     
1992   31    24    32    28  
1993   31    24    32    28  

ans_unigram_numbers_0 ans_unigram_numbers_1 ans_unigram_numbers_2 ans_unigram_numbers_3 \ 
        12      8   
        12    
        0     
        0     
        0     
        0     
        23    
        0     
        11    
        11    
        14      15      17      11 
        14      15      17      11 

levenshtein_dist que_entropy 
       9  3.189898 
       4  3.189898 
      170  4.299996 
      170  4.303341 
      170  4.304335 
      170  4.31182 
       24  4.110291 
       56  4.18172 
       24  3.084963 
       24  3.084963 
      18.75  3.29277 
      18.75  3.29277 

新生成的列應採取舊的名稱,添加索引在它的結尾。

回答

2

我認爲你可以使用:

cols = ['ans_length','ans_unigram_numbers'] 

df1 = pd.concat([pd.DataFrame(df[x].values.tolist()).add_prefix(x) for x in cols], axis=1) 
df = pd.concat([df1, df.drop(cols, axis=1)], axis=1) 
+0

完成2000線的執行時間爲2秒:D短而快,非常感謝,我一直在努力工作4個小時 –

0

基於@jezrael答案,我創建了一個做的是問一個函數,從給定的數據幀和列的定列表:

def flattencolumns(df1, cols): 
    df = pd.concat([pd.DataFrame(df1[x].values.tolist()).add_prefix(x) for x in cols], axis=1) 
    return pd.concat([df, df1.drop(cols, axis=1)], axis=1) 
相關問題