2017-06-01 16 views
1

データをインポートしたDataFrameがあります。しかし、インポートされたデータが正しくない可能性がありますので、私はそれを取り除こうとしています。例のデータフレーム:整数ではなく、指定された数値範囲外のパンダDataFrameから列を削除します

user test1 test2 other 
0 foo  1  7  bar 
1 foo  2  9  bar 
2 foo  3;as  5  bar 
3 foo  3  5  bar 

は、私が列test1test2をクリーンアップ取得したいです。私は指定された範囲内にない値と、何らかのエラー(上記のエントリ3;as)の文字列を含む値を取り除きたい。私は許容値の辞書を定義することによって、これをやっている:

values_dict = { 
    'test1' : [1,2,3], 
    'test2' : [5,6,7], 
} 

と列名のリストをI掃除したい:

headers = ['test1', 'test2'] 

それが今立っていると私のコード:

# Remove string entries 
for i in headers: 
    df[i] = pd.to_numeric(df[i], errors='coerce') 
    df[i] = df[i].fillna(0).astype(int) 

# Remove unwanted values 
for i in values_dict: 
    df[i] = df[df[i].isin(values_dict[i])] 

しかし、誤った値が削除されて、希望するデータフレームが次のようになっていると思われます。

user test1 test2 other 
0 foo  1  7  bar 
1 foo  3  5  bar 

助けてくれてありがとう!

+0

なぜ* test1 == 4 *の行が保持されていますか?許容範囲内でもないのですか? – Psidom

+0

私の一部に入力ミスがありました - ありがとう! – Kam

答えて

2

このようなことができます。複数の列からand条件を構築するnp.logical_andを使用してデータ・フレームサブセットためにそれを使用する:

headers = ['test1', 'test2'] 
df[pd.np.logical_and(*(pd.to_numeric(df[col], errors='coerce').isin(values_dict[col]) for col in headers))] 

# user test1 test2 other 
#0 foo  1  7  bar 
#3 foo  3  5  bar 

ブレークダウン:

[pd.to_numeric(df[col], errors='coerce').isin(values_dict[col]) for col in headers] 

は、まず、数値型に興味を持って列を変換した場合、次にチェックを列は特定の範囲にあります。各列のブール一連なるた:同時にすべての列から条件を満たすように

#[0  True 
# 1  True 
# 2 False 
# 3  True 
# Name: test1, dtype: bool, 
# 0  True 
# 1 False 
# 2  True 
# 3  True 
# Name: test2, dtype: bool] 

を、我々はnumpy.logical_andを用いてさらに構成することができるand操作を必要とします。 *を使用して、すべての列条件を引数として展開します。

+0

優れた説明、ありがとうございます。今すぐデータを適切にフィルタリングしているようです。 – Kam

+0

Cool。喜んでそれが役立ちます。 – Psidom

関連する問題