2017-08-16 58 views
1

我有包含像這樣的字符串列表一列DF:只保留項目從列表中數據幀包含特定字符

'Name'  'Method' 
1 foo  ['car', 'truck', 'transportation::plane'] 
2 bar  ['car', 'transportation::helicopter', 'boat'] 
3 baz  ['transportation::car', 'helicopter', 'boat'] 

我只是想保持在該列表中的項目下包含方法「::」,使我得到這樣的:

'Name'  'Method' 
1 foo  ['transportation::plane'] 
2 bar  ['transportation::helicopter'] 
3 baz  ['transportation::car'] 

我知道我可以做一個for循環每個列表進行迭代,然後使用列表理解,但我覺得必須有那並不是一個方法不涉及使用for循環。我試過以下內容

for j in range(len(df['Method'])): 
    df['Method'].iloc[j] = [x for x in df['Method'].iloc[j] if "::" in x] 

並且運行時間比我想要的要長得多。

回答

2

使用apply

In [220]: df.Method.apply(lambda x: [v for v in x if '::' in v]) 
Out[220]: 
1   [transportation::plane] 
2 [transportation::helicopter] 
3   [transportation::car] 

詳細

In [222]: df['NMethod'] = df.Method.apply(lambda x: [v for v in x if '::' in v]) 

In [223]: df 
Out[223]: 
    Name         Method      NMethod 
1 foo  [car, truck, transportation::plane]  [transportation::plane] 
2 bar [car, transportation::helicopter, boat] [transportation::helicopter] 
3 baz [transportation::car, helicopter, boat]   [transportation::car] 

或者,使用filter

In [225]: df.Method.apply(lambda x: filter(lambda v: '::' in v, x)) 
Out[225]: 
1   [transportation::plane] 
2 [transportation::helicopter] 
3   [transportation::car] 
Name: Method, dtype: object 
0

,也可以使用str.contains

from itertools import compress 
import pandas as pd 

df['Method'].apply(lambda x :list(compress(x,pd.Series(x).str.contains('::').tolist()))) 
相關問題