2017-05-25 409 views
1

請看下面的例子對付列表類似的數據:如何在大熊貓數據幀列

我有電子郵件的表,每一個電子郵件ID,和兩個標籤欄,通過不同的代碼路徑產生的,含與這些電子郵件相關的標籤列表。

df = pd.DataFrame({ 
    'id': [1,2,3,4], 
    'labels1': [np.array(['red']), np.array(['blue', 'green']), np.array(['blue']), np.nan], 
    'labels2': [np.nan, np.nan, np.array(['yellow', 'purple']), np.array(['magenta'])] 
}) 

df 
    id  labels1   labels2 
0 1   [red]    NaN 
1 2 [blue, green]    NaN 
2 3   [blue] [yellow, purple] 
3 4   NaN   [magenta] 


所以,我需要一種方法來產生以下數據框:

df_merge 
    id     labels  
0 1     [red] 
1 2   [blue, green] 
2 3 [blue, yellow, purple] 
3 4    [magenta] 

但使用lambda函數,我可能會與標列數據做拋出一個ValueError異常:

df.apply(lambda x: np.unique(np.append(x['labels1'], x['labels2'])), axis=1) 

ValueError: Shape of passed values is (4, 2), indices imply (4, 4) 

我在上面嘗試了很多不同的變化,都無濟於事。我想知道像這樣的像數組一樣的列數據是否是一種熊貓反模式,如果是這樣,有什麼更好的方法?

回答

3
  • 化妝NaN[]使用applymap
  • sum跨行

df[['id']].assign(
    labels=labels.applymap(lambda x: x if isinstance(x, list) else []).sum(1) 
) 

    id     labels 
0 1     [red] 
1 2   [blue, green] 
2 3 [blue, yellow, purple] 
3 4    [magenta]