2017-07-31 22 views
2

我有一個熊貓數據幀,看起來大致是如何從熊貓數據框中列出的名單,跳過NaN值

foo foo2 foo3 foo4 
a NY WA  AZ NaN 
b DC NaN NaN NaN 
c MA CA  NaN NaN 

我想使這個數據幀的意見的嵌套列表,但省略NaN值,所以我有[['NY','WA','AZ'],['DC'],['MA',CA']]之類的東西。

在這個數據框中有一個模式,如果這有所作爲,那麼如果fooX爲空,則隨後的列fooY也將爲空。

我最初有類似下面的代碼。我敢肯定有一個更好的辦法做到這一點

A = [[i] for i in subset_label['label'].tolist()] 
B = [i for i in subset_label['label2'].tolist()] 
C = [i for i in subset_label['label3'].tolist()] 
D = [i for i in subset_label['label4'].tolist()] 
out_list = [] 
for index, row in subset_label.iterrows(): 
out_list.append([row.label, row.label2, row.label3, row.label4]) 
out_list 

回答

3

試試這個:

In [77]: df.T.apply(lambda x: x.dropna().tolist()).tolist() 
Out[77]: [['NY', 'WA', 'AZ'], ['DC'], ['MA', 'CA']] 
2

選項1
pd.DataFrame.stack滴吶默認。

df.stack().groupby(level=0).apply(list).tolist() 

[['NY', 'WA', 'AZ'], ['DC'], ['MA', 'CA']] 

___

選項2
有趣的選擇,因爲我覺得熊貓對象中總結列出的樂趣。

df.applymap(lambda x: [x] if pd.notnull(x) else []).sum(1).tolist() 

[['NY', 'WA', 'AZ'], ['DC'], ['MA', 'CA']] 

選項3
numpy實驗

nn = df.notnull().values 
sliced = df.values.ravel()[nn.ravel()] 
splits = nn.sum(1)[:-1].cumsum() 
[s.tolist() for s in np.split(sliced, splits)] 

[['NY', 'WA', 'AZ'], ['DC'], ['MA', 'CA']]