2017-06-13 10 views
2

大きなデータセット(> 100.000、> 100)を扱っています。生のフォーマットはCSVです。 pandasライブラリを使用して、DataFrameというファイルを読みました。データフレームのpythonで間違ったデータポイントを見つける

すべてのデータは数値タイプ(浮動小数点数)でなければなりませんが、元のCSVファイルにデータポイントが見つからないか、誤った文字列が存在することがよくあります。 CSV全体をスキャンするには多くの時間がかかりますが、その点はまったく見つかりません。したがって、私はエラーを見つけることができる関数またはクラスを生成しようとしています。また、列と行の名前や番号を入力すると、それらをすばやくトレースできます。

正しいアルゴリズムを試して構築するために、いくつかのサンプルの誤ったデータポイントを含む小さなダミーのデータフレームを使用します。ポイントを見つけるための望ましい結果は、例えば、['B'、2]、['D'、4]であり、位置に列とインデックスを使用します。私は、元のデータフレームのブール文を含むマスクデータフレームを作成するダミーデータフレームで

# Import dependency 
import pandas as pd 

# Create dummy DataFrame for testing 
df = pd.DataFrame({'A': [1, 1, 1, 1, 1], 
        'B': [1, 1, '#', 1, 1], # Undesired datapoint '#' to be located 
        'C': [1, 1, 1, 1, 1], 
        'D': [1, 1, 1, 1, '0']}) # Undesired datapoint '0' to be located 

`

。マスクでは、すべての数値(intおよびfloat)にはTrueが与えられ、すべての非数値データはFalseとなります。

df_mask = df.applymap(lambda x: isinstance(x, (int, float))) 

ここで、数値以外のデータを見つける部分で、私は固まってしまいます。私の最高の試みは以下の通りですが、それは私にFalseポイントの場所を提供していません。マスクされたデータフレーム(df_mask)のFalse場所をつかむための方法だろう何

df_cols = col for col if df_mask.loc[False].any() 

DataFrameのエラーのあるデータポイントのトラッキングをさらに迅速に行う方法がありますか?

答えて

2

私はあなたがboolean indexingによってapplyと最後のフィルタでmaskを作成し、その後、unstackによる最初のSeriesを作成することができると思います。インデックスの値について

が必要アドオンremove_unused_levelsです:

df = df.unstack() 
df_mask = df.apply(lambda x: isinstance(x, (int, float))) 

print (df[~df_mask]) 
B 2 # 
D 4 0 
dtype: object 

print (df.index[~df_mask].remove_unused_levels().tolist()) 
[('B', 2), ('D', 4)] 

EDIT:

数値以外の値を抽出、その後NaN秒に変換値のerrors='coerce'to_numericを使用し、それらをチェックしたい場合

df = pd.DataFrame({'A': [1, 1, 1, 1, 1], 
        'B': [1, 1, '#', 1, 1], 
        'C': [1, 1, 1, 1, 1], 
        'D': [1, 1, 1, 1, '0']}).astype(str) 

print (df.applymap(type)) 
       A    B    C    D 
0 <class 'str'> <class 'str'> <class 'str'> <class 'str'> 
1 <class 'str'> <class 'str'> <class 'str'> <class 'str'> 
2 <class 'str'> <class 'str'> <class 'str'> <class 'str'> 
3 <class 'str'> <class 'str'> <class 'str'> <class 'str'> 
4 <class 'str'> <class 'str'> <class 'str'> <class 'str'> 

df = df.unstack() 
df_mask = pd.to_numeric(df, errors='coerce').isnull() 
print (df[df_mask]) 
B 2 # 
dtype: object 

print (df.index[df_mask].remove_unused_levels().tolist()) 
[('B', 2)] 
+0

非常にjezrael、本当に助けてくれてありがとう! (遅く返事を申し訳ありません)。しかし、それは疑問のようにダミーのデータフレームを設定した場合にのみ機能します。同じデータをCSVを「pd.read_csv」を使用してデータフレームとしてインポートし、unstack()してマスクを適用すると、行が数値以外の値を持つ列全体のすべての値に対してFalseが返されます。違いの原因を知っていますか? – HelloBlob

+0

@HelloBlob - 編集した回答を確認してください。 – jezrael

関連する問題