Редактировать :
Что касается обновленного вопроса по проблеме row 1
, попробуйте выполнить команду ниже для ваших данных
df.loc[df["sumABCD"] < 1.0, "sumABCD"].map('{0:.30f}'.format)
Out[28]:
1 0.999999999999999888977697537484
13 0.999999999999999888977697537484
44 0.999999999999999888977697537484
53 0.999999999999999888977697537484
57 0.999999999999999888977697537484
Она нарезается на sumABCD
столбцы <1.0. Строка 1 на самом деле не <code>1.0. Его значения почти 1.0
и округлены до 1.0
. Из-за представления чисел в компьютерной системе float
не гарантирует сохранение точности в арифметических операциях. sumABCD
- сумма делений в каждом столбце. Эти деления привели к потере точности, поэтому сумма возвращается только к almost 1.0
Если вам нужна дополнительная информация по float
, прочитайте эту документацию https://docs.python.org/3/tutorial/floatingpoint.html
IIUC, в вашем примере кода вы думаете, что должны получить пустой фрейм данных, но это не так.
После этого
mask2 = ((df["B"] <= x) & (df["sumABCD"] < 1.0))
mask2
всегда False
, поскольку (df["sumABCD"] < 1.0)
всегда False
Однако, вы нарезаете df
на *Оператор 1038 *, как в
test = df[mask1 | mask2]
Итак, mask2
all False
не повлияет на результат. Когда mask2
- это все False
, результат зависит от mask1
. Такова природа оператора '|'
. Следовательно, test
будет зависеть от True/False
из mask1
. По этой причине test
не является пустым кадром данных, как вы ожидаете.