2017-03-17 5 views
1

私は、データを読み出すたデータセット、df.dir.value_counts()戻りパンダ:非整数データをドロップし

169  23042 
170  22934 
168  22873 
316  22872 
315  22809 
171  22731 
317  22586 
323  22561 
318  22530 

     ... 
0.069  1 
0.167  1 
0557   1 
0.093  1 
1455   1 
0.130  1 
0.683  1 
2211   1 
3.714  1 
1.093  1 
0819   1 
0.183  1 
0.110  1 
2241   1 
0.34   1 
0.330  1 
0.563  1 
60+9   1 
0.910  1 
0.232  1 
1410   1 
0.490  1 
0.107  1 
1.257  1 
1704   1 
0.491  1 
1.180  1 
5-230  1 
1735   1 
1.384  1 

dir列が方向についてであるがあり、データが(0361)の範囲の整数でなければなりません。ご覧のとおり、value_counts()リストの最後には多くのエロナスデータがあります。

私が知りたいのは、どのように非整数データを削除できますか?


いくつかの可能な方法

1.整数としてread_csvとスローすべての非整数データ

しかし
df = pd.read_csv("/data.dat", names = ['time', 'dir'], dtype={'dir': int}}) 

があり、そこにエラーデータのようないくつかの文字列など60+9、希望エラーの原因となります。私はそれをどう扱うかわかりません。

2.Select isdigit()ことで、その後は何意気消沈

df = df[df['dir'].apply(lambda x: str(x).isdigit())] 
df['dir']=pd.to_numeric(df['dir'], downcast='integer', errors='coerce') 

これはDrop rows if value in a specific column is not an integer in pandas dataframeからである、と私のために正常に動作しますが、それはあまりにも少し感じています。より良いアプローチがあるのだろうか?

答えて

2

私はそれは

が整数である何が、それ自体1で割った床に等しいはずであるdf

df = pd.DataFrame(dict(dir=[1, 1.5, 2, 2.5])) 
print(df) 

    dir 
0 1.0 
1 1.5 
2 2.0 
3 2.5 

データフレームを考える仕組み

df.dir[df.dir == df.dir // 1] 

が好きです。

df.assign(floor_div=df.dir // 1) 

    dir floor_div 
0 1.0  1.0 
1 1.5  1.0 
2 2.0  2.0 
3 2.5  2.0 

だから我々は、彼らが

df.assign(
    floor_div=df.dir // 1, 
    is_int=df.dir // 1 == df.dir 
) 

    dir floor_div is_int 
0 1.0  1.0 True 
1 1.5  1.0 False 
2 2.0  2.0 True 
3 2.5  2.0 False 

だからフィルターに、我々はデモの列にboolean型マスクを使用することができます等しいときのためにテストすることができ'is_int'

df.dir[df.dir == df.dir // 1] 

0 1.0 
2 2.0 
Name: dir, dtype: float64 

もしそここの列の文字列です。次に、pd.to_numeric

を組み込むことができます
df.dir = pd.to_numeric(df.dir, 'coerce') 
df.dir[df.dir == df.dir // 1] 

+0

この列には 'string'型がありますが、これは' // 'であれば分かりませんか? – cqcn1991

+0

@ cqcn1991更新を参照 – piRSquared

+0

@piRSquared - フロア分割がいい – jezrael

関連する問題