2016-04-11 111 views
2

我有一個pandas.core.frame.DataFrame,看起來像這樣:大熊貓據幀爆炸列內容

  0 1 
0 [1,2,3] 1 
1 [2,2,1] 1 
2 [1,2,1] 1 
... 

的最後一列是標籤,每個柱下「0」的陣列應該是給定類不同的數據點。

我希望這可以變成:

x0 x1 x2 label 
0 1 2 3 1 
1 2 2 1 1 
2 1 2 1 1 

我都試過,沒有運氣

ds = ds.apply(lambda x: numpy.ravel(x)) 

這是下面的結果如下,顯然是不應該做的方式這個。

<list>.extend(zip(points,labels)) 
ds = pandas.core.frame.DataFrame(data=<list>) 

有關如何修復實際數據集或正確創建具有兩個列表(點和標籤)的任何幫助,請參閱。

回答

2

這是我會怎麼做。首先刪除您的1列(所以我們不亂的命名):

df['id'] = df[1] 
df = df.drop(1, axis = 1) 

然後創建一個OBJ文件,與我們要Concat的東西,CONCAT:

objs = [df, pd.DataFrame(df[0].tolist())] 
pd.concat(objs, axis=1) 



      0 id 0 1 2 
0 [1, 2, 3] 1 1 2 3 
1 [2, 2, 1] 1 2 2 1 
2 [1, 2, 1] 1 1 2 1 
+0

此解決方案效果最好!我修改了第二部分:'pd.concat([df,pd.DataFrame(list(df [0]))],axis = 1)',似乎比使用'.tolist( )'。謝謝! – Thanos

0

您可以以不同方式創建數據框以獲得所需內容而不是試圖展開列。請參見下面的代碼,

import pandas as pd 
points = [[1,2,3],[2,2,1],[1,2,1]] 
labels = [1,1,1] 
x0 = [p[0] for p in points] 
x1 = [p[1] for p in points] 
x2 = [p[2] for p in points] 
df = pd.DataFrame({'x0': x0,'x1': x1,'x2': x2, 'label': labels}) 
print (df) 

搞定,

label x0 x1 x2 
0  1 1 2 3 
1  1 2 2 1 
2  1 1 2 1 
-1

最好的,我可以提供:

import numpy as np 
# first convert your lists to an array, then iterate 
tmp = np.array(df[0].tolist()) 

for r in np.arange(0,3): 
    df['x' + str(r)] = tmp[:,r] 
1

我假設你的當前列標題是文本而不是整數。

df2 = pd.concat([pd.DataFrame(zip(*df['0'])), df['1']], axis=1) 
df2.columns = ['x' + str(c) for c in df2.columns[:-1]] + ['label'] 

>>> df2 
    x0 x1 x2 label 
0 1 2 1  1 
1 2 2 2  1 
2 3 1 1  1 

*運營商使用zip解壓名單:

>>> zip(*df['0']) 
[(1, 2, 1), (2, 2, 2), (3, 1, 1)] 

所以,你可以輕鬆擴展數據幀:

>>> pd.DataFrame(zip(*df['0'])) 
    0 1 2 
0 1 2 1 
1 2 2 2 
2 3 1 1 

,那麼你只需要連接的最後一列,並重新命名所有的列。

+0

列是整數。當我嘗試pd.DataFrame(zip(* ds [0]))時,我得到以下錯誤:frame.py 283 mgr = self._init_dict({},索引,列,dtype = dtype) 284 elif isinstance(data, (數據參數不能爲迭代器) 286 else: 287 try: TypeError:數據參數不能是迭代器。有任何想法嗎? – Thanos