2017-12-14 5 views
1

パンダのデータフレーム列のどのセルに、特定の参照文字列の部分文字列が含まれているかをテストするにはどうすればよいですか?私はこのようになりますパンダのデータフレームを扱っています

0 Item   Category 
1 Hammer  A 
2 Car   A 
3 Cardiologist B 
4 Park   A 
5 Parkway  A 
6 CarparkCar A 

私は私の基準ワードの列として定義された文字の特定のシーケンスを含むItemのすべてのセルを見つける必要があります。私は参照単語に存在しない追加の文字を含むセルには興味がありません。

reference_word = Carpark 

所望の出力:

0 Item   Category Contains_substring_of_reference_word 
1 Hammer  A   FALSE 
2 Car   A   TRUE 
3 Cardiologist B   FALSE 
4 Park   A   TRUE 
5 Parkway  A   FALSE 
6 CarparkCar A   TRUE 

パンダのデータフレームの列のどのセルをチェックする方法は、与えられた単語/文字列の部分文字列が含まれていますか?

+0

使用して適用し、この – bigbounty

+0

が、具体的にすることが可能であるなら、私に親切はい、それは可能である@sudonym(すなわち、リンクまたはいくつかのコードが含まれる) – sudonym

+1

を聞いてみましょう行うためのIndexOfメソッド。私の答えを見てください。設定操作(探しているもの)は、言語や方法に関係なく、一般的に遅いことに注意してください。 –

答えて

3

オプション1
apply + set.issubset使用しているこれを行う1つの簡単な方法 -

df['Contains_substring_of_reference_word'] = v 
df 

      Item Category Contains_substring_of_reference_word 
0  Hammer  A         False 
1   Car  A         True 
2 Cardiologist  B         False 
3   Park  A         True 
4  Parkway  A         False 
5 CarparkCar  A         True 

オプション2-

v = df.Item.str.lower().apply(lambda x: set(x).issubset('carpark')) 
v 

0 False 
1  True 
2 False 
3  True 
4 False 
5  True 
Name: Item, dtype: bool 

が戻って結果を割り当てます。 set.difference操作用い 別の解決策 - np.vectorizeと別のオプションを追加するオプション3

(df.Item.str.lower().apply(set) - set('carpark')).str.len() == 0 

0 False 
1  True 
2 False 
3  True 
4 False 
5  True 
Name: Item, dtype: bool 

を、これが高速であるべきです。

c = set('carpark') 
def foo(x): 
    return c.issuperset(x.lower()) 

v = np.vectorize(foo) 

v(df.Item) 
array([False, True, False, True, False, True], dtype=bool) 

タイミング

df = pd.concat([df] * 100000, ignore_index=True) 

%timeit df.Item.str.lower().apply(lambda x: set(x).issubset('carpark')) 
1 loop, best of 3: 927 ms per loop 

%timeit (df.Item.str.lower().apply(set) - set('carpark')).str.len() == 0 
1 loop, best of 3: 1.13 s per loop 

%timeit v(df.Item) 
1 loop, best of 3: 497 ms per loop 
+0

2番目のソリューションはいいです、また高速ですか? (+1) – jezrael

+1

@jezraelありがとう!また、良い質問。私はちょうどこれを試み、それは最初より少しゆっくりです。面白い! –

+1

@jezraelあなたのご意見は、より迅速な解決策を見つけることを奨励しました! –

1

あなたは理解してセットを作成し、サブセットを表すために<=を使用することができます。

sets = np.array([set(x.lower()) for x in df.Item.values.tolist()]) 
df.assign(Bool=sets <= set('carpark')) 

      Item Category Bool 
0        
1  Hammer  A False 
2   Car  A True 
3 Cardiologist  B False 
4   Park  A True 
5  Parkway  A False 
6 CarparkCar  A True 
+0

私は割り当てを削除し、それをテストしました。これは、1つのループ、最良の3:555ms /ループを与える。驚くばかり! –

関連する問題