2016-07-12 13 views
4

Iにリストを持っている:検索 - パンダ - パイソン

things = ['A1','B2','C3'] 

Iは、セミコロンで区切られた値を含む列を持つパンダデータフレームを持っている - いくつかの上記のリスト内の項目のいずれかとの一致が含まれます(列内に文字列の他の部分があるため、完全一致ではありません。たとえば、その列の行には「Wow;ここに;これはA1; 10001; 0 ')

リストの項目との一致を含む行を保存してから、新しいデータフレームを作成したいそれらの選択された行(同じヘッダーを持つ必要があります)。

とValueError:データフレームの真理値があいまいな

import re 

for_new_df =[] 

for x in df['COLUMN']: 
    for mp in things: 
     if df[df['COLUMN'].str.contains(mp)]: 
      for_new_df.append(mp) #This won't save the whole row - help here too, please. 

このコードは私にエラーを与えた:これは私が試したものです。 a.empty、a.bool()、a.item()、a.any()またはa.all()を使用します。

私はコーディングがとても新しいので、解説の詳細と詳細が分かります。前もって感謝します。

答えて

6

あなたは正規表現を作成し、str.containsを使用する単語のリストを結合してループを避けることができます。

pat = '|'.join(thing) 
for_new_df = df[df['COLUMN'].str.contains(pat)] 

はちょうど

を動作するはずですので、正規表現パターンは次のようになります。'A1|B2|C3'と、これはどこかで一致しますこれらの文字列のいずれかを含む、あなたの文字列

例:

In [65]: 
things = ['A1','B2','C3'] 
pat = '|'.join(things) 
df = pd.DataFrame({'a':['Wow;Here;This=A1;10001;0', 'B2', 'asdasda', 'asdas']}) 
df[df['a'].str.contains(pat)] 

Out[65]: 
          a 
0 Wow;Here;This=A1;10001;0 
1      B2 

それが失敗した理由については:

df[df['COLUMN'].str.contains(mp)] 

は、あなたの内str.containsのブール配列、ifによってマスクされたDFはの配列を評価する方法を理解していないが返されます。

if df[df['COLUMN'].str.contains(mp)] 

このラインブーリアンですのでエラーです。あなたがそれについて考えるなら、もしあなたが本当ならば、それは何をすべきでしょうか?値のような配列ではなくスカラーが必要です。

+0

申し訳@EdChum - 私の解決策に取り組んなくなり、私はあなた次第あなたが – emmalg

+0

@emmalg心配を重複していたことに気づきませんでした@EdChumリスト(items = ['A1 | B1 | C1'])のどの項目が列 'A'に全く見つからないかを確認するにはどうすればよいでしょうか? – EdChum

+0

を何をしたいのか、私は基本的にあなた –

2

パンダは実際には素晴らしいですが、私はそれを使用することは非常に簡単ではありません。しかし、巨大なデータフレームを検索するためのツールを含む、多くの機能を備えています。

あなたの問題を完全には解決できない場合もありますが、これは右足を止めるのに役立ちます。私はあなたがどの列を検索しているか、私の例では列Aを知っていると仮定しています。

import pandas as pd 

df = pd.DataFrame({'A' : pd.Categorical(['Wow;Here;This=A1;10001;0', 'Another;C3;Row=Great;100', 'This;D6;Row=bad100']), 
        'B' : 'foo'}) 
print df #Original data frame 
print 
print df['A'].str.contains('A1|B2|C3') # Boolean array showing matches for col A 
print 
print df[df['A'].str.contains('A1|B2|C3')] # Matching rows 

出力:

      A B 
0 Wow;Here;This=A1;10001;0 foo 
1 Another;C3;Row=Great;100 foo 
2  This;D6;Row=bad100 foo 

0  True 
1  True 
2 False 
Name: A, dtype: bool 

          A B 
0 Wow;Here;This=A1;10001;0 foo 
1 Another;C3;Row=Great;100 foo 
関連する問題