2017-09-17 47 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