2016-12-04 4 views
0

Iは、次のCSVファイルのtest.CSVている場合:Pythonの使用試験パンダのデータフレームの値が別の列で示されるセットのメンバーシップである場合

C01,45,A,R 
C02,123,H,I 

Iが

として設定 RIを定義有します
R=set(['R','E','D','N','P','H','K']) 
I=set(['I','H','G','F','A','C','L','M','P','Q','S','T','V','W','Y']) 

私は、文字列Aが(偽の)セットRのメンバーである場合、文字列Hが(本当です)セットIのメンバーであるかどうかをテストできるようにしたいです。私は次のスクリプトでこれを行うことを試みた:私はA in Rの同等か、むしろtable.columns[3] in table.columns[4]を行うと、データの行ごとにTRUEまたはFALSEを返すしようとしています

#!/usr/bin/env python 
import pandas as pd 

I=set(['I','H','G','F','A','C','L','M','P','Q','S','T','V','W','Y']) 
R=set(['R','E','D','N','P','H','K']) 

with open(test.csv) as f: 
    table = pd.read_table(f, sep=',', header=None, lineterminator='\n') 
table[table.columns[3]].astype(str).isin(table[table.columns[4]].astype(str)) 

すなわち。

唯一の問題は、最終行を使用して2行がTRUEを返すことです。私は

table[table.columns[3]].astype(str).isin(R) 

に最終行を変更した場合それから私は正しいです

0 FALSE 
1 TRUE 

を取得します。それは私が行うときにセット名を正しく参照していないようです.isin(table[table.columns[3]].astype(str))

アイデア?

+0

あなたがチェックしようとしているものは混乱しています。あなたは言い換えることができますか? –

+1

ファイルから 'R'という文字をセット名として使用しますか?もしそうなら、あなたの最善の策は辞書を使うことです。 – ayhan

+0

基本的にAは集合Rには含まれていませんが、Hは集合Iにあります。列3と4を比較するメンバーシップの結果を出力します – brucezepplin

答えて

1

次から開始:

In [21]: df 
Out[21]: 
    0 1 2 3 
0 C01 45 A R 
1 C02 123 H I 

In [22]: R=set(['R','E','D','N','P','H','K']) 
    ...: I=set(['I','H','G','F','A','C','L','M','P','Q','S','T','V','W','Y']) 
    ...: 

あなたはこのような何か行うことができます:

In [23]: sets = {"R":R,"I":I} 

In [24]: df.apply(lambda S: S[2] in sets[S[3]],axis=1) 
Out[24]: 
0 False 
1  True 
dtype: bool 

フェア警告、.applyが遅く、非常によく、より大きなデータに合わせて拡張しませんが。利便性と最後の手段のためにそこにあります。

+0

ありがとうございます - これは辞書を使ってどのように実装されますか(私はデータフレームを使用すべきではない場合) – brucezepplin

+0

@brucezepplin達成しようとしていることを理解していないと、 –

関連する問題