2016-10-18 8 views
3

日付と時刻の値の列と測定値(浮動小数点)を含む別の列を含むデータセットがあります。しかし、いくつかの測定中にエラーが発生し、いくつかの奇妙なエントリが発生しました。これらのエントリには、文字列、完全ではない文字列、欠損値、または値として解釈されるdatetimeオブジェクトの繰り返し部分が含まれます。 (測定値はほとんど10と50の間であるが、時々私は100のようにゼロまたは値を取得する)範囲外の方法である他のカラム(パンダのデータフレームとしてロード)大きなデータセットから種類と値に基づいてパンダデータフレームの「不良」行を削除します

エキス:

障害のあるエントリのすべてのタイプの
         t       baaa 
0      13/11/2014 23:43       17.6 
1      13/11/2014 23:44       17.7 
2 2014-11-13 23:452014-11-13 23:45:00       17.7 
3      13/11/2014 23:46       17.7 
4      14/11/2014 00:34       16 
5      14/11/2014 00:35       15.9 
6         :00       17.7 
7      14/11/2014 01:25       14.9 
8      14/11/2014 01:26       14.9 
9          0       80 
10      14/11/2014 02:16       14.3 
11      14/11/2014 02:17       14.3 
12         NaN AA550112209500080009002855AA 
13      14/11/2014 03:09       13 
14      009000B002B55AA       NaN 
15      14/11/2014 02:19       14.3 
16      14/11/2014 03:59       12.6 
17      14/11/2014 04:00       12.6 
18      14/11/2014 05:41       11.7 
19      14/11/2014 05:42       11.7 
20         0       140 
21      14/11/2014 04:53       12.2 

例はここにある。私は、障害のある行を取り除くことができますどのように ? 私の考えは、共同を設定し、もしループを行うことでした't'列はdatetimeオブジェクトでなければならず、 'baaa'列はfloat> 0と<です。条件が満たされない場合、値をnp.nanに置き換え、最終的にdropna関数を使用します。

df['t'] = pd.to_datetime(df['t'], format = '%d/%m/%Y %H:%M', errors='coerce') 
df.iloc[:,1] = pd.to_numeric(df.iloc[:,1], errors='coerce')  
for line in df.iloc[:,1]: 
    if (line < 60) & (line > 0): 
     line = line 
    else: 
     line = np.nan 
    # not assigning this new value! :( 

    df = df.dropna(subset = df.columns.values, how='any', inplace=True) 

これはラインは私が間違った構文を持っている必要があります 60よりも低いことが必要であるという条件以外の問題のほとんどを解決しているようですか?またはここで何が間違っていますか? ありがとう!

答えて

2

私はあなたの代わりにdropnaあなたがnotnullで新しい(第3)の条件を追加することができ、フィルタリングのためboolean indexingが必要だと思う - 列t内のすべてではないNaNの値を取得します。第1の列の値

df['t'] = pd.to_datetime(df['t'], format = '%d/%m/%Y %H:%M', errors='coerce') 
df.iloc[:,1] = pd.to_numeric(df.iloc[:,1], errors='coerce') 
df = df[(df.iloc[:,1] < 60) & (df.iloc[:,1] > 0) & (df['t'].notnull())] 

print (df) 
        t baaa 
0 2014-11-13 23:43:00 17.6 
1 2014-11-13 23:44:00 17.7 
3 2014-11-13 23:46:00 17.7 
4 2014-11-14 00:34:00 16.0 
5 2014-11-14 00:35:00 15.9 
7 2014-11-14 01:25:00 14.9 
8 2014-11-14 01:26:00 14.9 
10 2014-11-14 02:16:00 14.3 
11 2014-11-14 02:17:00 14.3 
13 2014-11-14 03:09:00 13.0 
15 2014-11-14 02:19:00 14.3 
16 2014-11-14 03:59:00 12.6 
17 2014-11-14 04:00:00 12.6 
18 2014-11-14 05:41:00 11.7 
19 2014-11-14 05:42:00 11.7 
21 2014-11-14 04:53:00 12.2 
によって第1の列の値を NaNにフィルタリングする。
関連する問題