2017-09-17 50 views
3

我有這樣的名單如下刪除含有大熊貓元組的空單排

name  foo_list 
'foo' [('bleh'), ('blah')] 
'bar' [(), 'boo'] 
'foobar' [(),(),()] 

我想刪除所有空的元組和櫃面所有的丘壑一個數據幀都是空的元組,只是下降的行全部。 此外,我想將這個元組列表轉換爲列表。 所以,輸出將是

name  foo_list 
'foo' ['bleh', 'blah'] 
'bar' [ 'boo'] 

我如何做到這一點在熊貓?

回答

3

試試這個嗎?

數據輸入:

df=pd.DataFrame({'name':['A','B','C'],'foo_list':[[('bleh'),('blah')], [(), 'boo'],[(),(),()]]}) 

解決方案:

df['foo_list']=df['foo_list'].apply(lambda x : [t for t in x if t !=()]) 
df.loc[df['foo_list'].apply(len)>0,:] 

Out[20]: 
     foo_list name 
0 [bleh, blah] A 
1   [boo] B 

時序(小尺寸)

%timeit df['foo_list'].apply(lambda x : [t for t in x if t !=()])#Wen 
10000 loops, best of 3: 117 µs per loop 

%timeit df.foo_list.apply(lambda x: filter(None, x)) # John 
10000 loops, best of 3: 121 µs per loop 

大尺寸會推薦約翰的解決方案

df=pd.concat([df]*10000,0) 

%timeit df.foo_list.apply(lambda x: filter(None, x)) 
100 loops, best of 3: 10.2 ms per loop 
%timeit df['foo_list'].apply(lambda x : [t for t in x if t !=()]) 
100 loops, best of 3: 17.1 ms per loop 
+1

我得到了相同的答案,但我用''DF – Dark

+0

@Bharathshetty啊哈[DF [ 'foo_list']申請(LEN)> 0。]: ) – Wen

+0

@JohnGalt完全不需要,你的解決方案已經比我的速度快:) – Wen

3

使用filter刪除列表中的空元組。

In [679]: df['foo_list'] = df.foo_list.apply(lambda x: list(filter(None, x))) 

使用str.len刪除空列表

In [680]: df.loc[df.foo_list.str.len()>0] 
Out[680]: 
     foo_list name 
0 [bleh, blah] A 
1   [boo] B