2017-02-12 1 views
1

私はPythonで初心者です。私の質問はちょっと詰まっています。セルからの文字列が特定のワイルドカード規則と一致する場合、dataFrameから行を選択したいと思います。私たちは、この例を想定してみましょう:画面へパンダデータフレーム - ワイルドカードでの選択行が

表:

df=pd.DataFrame({'Column':[ 
    'select rows in pandas DataFrame using comparisons against two columns', 
    'select rows from a DataFrame based on values in a column in pandas', 
    'use a list of values to select rows from a pandas dataframe', 
    'selecting columns from a pandas dataframe based on row conditions', 
    'select particular columns from inside groups in pandas dataframe']}) 

    Column 
0 select rows in pandas DataFrame using comparisons against two columns 
1 select rows from a DataFrame based on values in a column in pandas 
2 use a list of values to select rows from a pandas dataframe 
3 selecting columns from a pandas dataframe based on row conditions 
4 select particular columns from inside groups in pandas dataframe 

ルール:

Rules=pd.DataFrame({'SearchTerms':['*select*DataFrame*row*','*select*dataframe*row*']}) 

    SearchTerms 
0 *select*DataFrame*row* 
1 *select*dataframe*row* 

結果:

Column 
0 select rows in pandas DataFrame using comparisons against two columns 
1 select rows from a DataFrame based on values in a column in pandas 
2 use a list of values to select rows from a pandas dataframe 

は、私はそのような複数の文でのfnmatch使用しようとしました:

import fnmatch 
selection=[] 
for row in df['Column']: 
    selection.append(fnmatch.fnmatch(row,Rules[0])|fnmatch.fnmatch(row,Rules[1])) 

QUESTION私はワイルドカード文の数が可変でデータフレームから行を選択するにはどうすればよい

?どこにもやっていない

ライフ。誰か助けて! ;)事前に

おかげで、 "ワイルドカード" の

+0

データフレームの例で提供されるものですか。 – Chuck

+0

確かに@CharlesMorris –

+0

最初のデータフレームを検索し、ルールのデータフレームに含まれる2つの文字列条件との一致を探したいとしますか?ルールデータフレーム内のどの単語を検索する必要がありますか?私。それは 'DataFrame'か' row'か 'rows'か' Dataframe'ですか?あなたの機能は機能しますか? – Chuck

答えて

1

ソリューション:

データ:

In [53]: df 
Out[53]: 
                    Column 
0 select rows in pandas DataFrame using comparisons against two columns 
1  select rows from a DataFrame based on values in a column in pandas 
2   use a list of values to select rows from a pandas dataframe 
3  selecting columns from a pandas dataframe based on row conditions 
4  select particular columns from inside groups in pandas dataframe 

In [54]: Rules 
Out[54]: 
       SearchTerms 
0 *select*DataFrame*row* 
1 *select*dataframe*row* 

ソリューション:

In [55]: pat = Rules.SearchTerms.str.replace('\*', r'.*').str.cat(sep='|') 

In [56]: df[df.Column.str.contains(pat, flags=re.I)] 
Out[56]: 
                   Column 
3 selecting columns from a pandas dataframe based on row conditions 

生成されるRegexパターン:

In [64]: pat 
Out[64]: '.*select.*DataFrame.*row.*|.*select.*dataframe.*row.*' 
+0

だから、pandasデータフレームでregexを使う必要がありますか?次のようなステートメントを使用することはできません:( '​​dataframe' ** AND **' row' ** AND ** 'select')** OR **(' DataFrame' ** AND ** 'row' ** AND ** 'select') –

+0

@ B.Gees、可能ですが、ワイルドカードと__nothing__を持っています... – MaxU

+0

それについてもっと知ってもらうのを助けてください、私はそのことで非常に面白いです:) –

0

私はあなたがパンダに内蔵された文字列マッチング機能を使用して、より良い成功を持っているかもしれないと思います。文字列のコレクションであるpandas Seriesオブジェクト(DataFrame列がSeriesオブジェクト)を使用している場合は、.str.<method>を呼び出すことができます。そこ可能な文字列の方法の非常に大きなコレクションですが、この場合には、あなたは.str.match(...).str.contains(...)のいずれかを使用することができます。これらのメソッドの

どちらも、正規表現文を受け入れます。これは、ワイルドカード式をregExに変更することを意味します。

df[df.Column.str.match('select|DataFrame|row', case=False)] 

              Column 
0 select rows in pandas DataFrame using comparis... 
1 select rows from a DataFrame based on values i... 
3 selecting columns from a pandas dataframe base... 
4 select particular columns from inside groups i... 
+0

こんにちは@ジェームズ。このソリューションでは、** AND **ステートメントを適用することはできませんか? –

+0

あなたのソリューションに感謝してくれたJames –