2016-09-29 9 views
3

私はNaN値と浮動小数点値を含む浮動小数点型の列を持っています。 .0で終わらない値を除外するにはどうすればよいですか?例えば".0"で終わらない表示値Python Pandas

Col1 
0.7 
1.0 
1.1 
9.0 
9.5 
NaN 

欲望の結果は次のようになります。

Col1 
0.7 
1.1 
9.2 

答えて

3

あなたはboolean indexingを使用することができます。

#convert to string and compare last value 
print ((df.Col1.astype(str).str[-1] != '0') & (df.Col1.notnull())) 
0  True 
1 False 
2  True 
3 False 
4  True 
5 False 
Name: Col1, dtype: bool 

print (df[(df.Col1.astype(str).str[-1] != '0') & (df.Col1.notnull())]) 
    Col1 
0 0.7 
2 1.1 
4 9.5 

ìntに変換された値を比較するためのソリューションが、最初の必要性fillna

s = df.Col1.fillna(1) 
print (df[s.astype(int) != s]) 
    Col1 
0 0.7 
2 1.1 
4 9.5 

タイミング

#[30000 rows x 1 columns] 
df = pd.concat([df]*10000).reset_index(drop=True) 

def jez2(df): 
    s = df.Col1.fillna(1) 
    return (df[s.astype(int) != s]) 

In [179]: %timeit (df[(df.Col1.astype(str).str[-1] != '0') & (df.Col1.notnull())]) 
10 loops, best of 3: 80.2 ms per loop 

In [180]: %timeit (jez2(df)) 
1000 loops, best of 3: 1.16 ms per loop 

In [181]: %timeit (df[df.Col1 // 1 != df.Col1].dropna()) 
100 loops, best of 3: 3.04 ms per loop 

In [182]: %timeit (df[df['Col1'].mod(1) > 0].dropna()) 
100 loops, best of 3: 2.58 ms per loop 
2

使用//分割

df[df.Col1 // 1 != df.Col1].dropna() 

enter image description here

2

は、別の方法は、1と剰余を計算するmod(1)を使用することである。

In [60]: 
df[df['Col1'].mod(1) > 0].dropna() 

Out[60]: 
    Col1 
0 0.7 
2 1.1 
4 9.5 

ここで我々はmodの効果を確認、全体の数字は小数部分ながら0なるままになります:

In [62]: 
df['Col1'].mod(1) 

Out[62]: 
0 0.7 
1 0.0 
2 0.1 
3 0.0 
4 0.5 
5 NaN 
Name: Col1, dtype: float64 
関連する問題