Отображение значений, которые не заканчиваются на ".0" Питон Панды


У меня есть столбец float, который содержит значения NaN и значения float. Как отфильтровать те значения, которые не заканчиваются на .0?

Например:

Col1
0.7
1.0
1.1
9.0
9.5
NaN

Результат желания будет:

Col1
0.7
1.1 
9.2
3 3

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

Использование // деление

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

Введите описание изображения здесь

Другой метод заключается в использовании mod(1) для вычисления модуля с 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