57
задан 13 October 2017 в 04:47

3 ответа

Я получил это предупреждение, потому что я думал, что мой столбец содержал пустые строки, но на проверке, это содержало np.nan!

if df['column'] == '':

Изменение моего столбца к пустым строкам помогло :)

0
ответ дан 1 November 2019 в 16:46

Я сравнил несколько методов, возможных для того, чтобы сделать это, включая панд, несколько numpy методов и метод понимания списка.

Первый, давайте запустимся с базовой линии:

>>> import numpy as np
>>> import operator
>>> import pandas as pd

>>> x = [1, 2, 1, 2]
>>> %time count = np.sum(np.equal(1, x))
>>> print("Count {} using numpy equal with ints".format(count))
CPU times: user 52 µs, sys: 0 ns, total: 52 µs
Wall time: 56 µs
Count 2 using numpy equal with ints

Так, наша базовая линия - то, что количество должно быть корректно 2, и мы должны взять приблизительно 50 us.

Теперь, мы пробуем наивный метод:

>>> x = ['s', 'b', 's', 'b']
>>> %time count = np.sum(np.equal('s', x))
>>> print("Count {} using numpy equal".format(count))
CPU times: user 145 µs, sys: 24 µs, total: 169 µs
Wall time: 158 µs
Count NotImplemented using numpy equal
/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/ipykernel_launcher.py:1: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison
  """Entry point for launching an IPython kernel.

И здесь, мы получаем неправильный ответ (NotImplemented != 2), нам требуется долгое время, и это бросает предупреждение.

, Таким образом, мы попробуем другой наивный метод:

>>> %time count = np.sum(x == 's')
>>> print("Count {} using ==".format(count))
CPU times: user 46 µs, sys: 1 µs, total: 47 µs
Wall time: 50.1 µs
Count 0 using ==

Снова, неправильный ответ (0 != 2). Это еще более коварно, потому что нет никаких последующих предупреждений (0, может быть роздан точно так же, как 2).

Теперь, давайте попробуем понимание списка:

>>> %time count = np.sum([operator.eq(_x, 's') for _x in x])
>>> print("Count {} using list comprehension".format(count))
CPU times: user 55 µs, sys: 1 µs, total: 56 µs
Wall time: 60.3 µs
Count 2 using list comprehension

Мы получаем правильный ответ здесь, и это довольно быстро!

Другая возможность, pandas:

>>> y = pd.Series(x)
>>> %time count = np.sum(y == 's')
>>> print("Count {} using pandas ==".format(count))
CPU times: user 453 µs, sys: 31 µs, total: 484 µs
Wall time: 463 µs
Count 2 using pandas ==

Медленный, но корректный!

И наконец, опция я собираюсь использовать: кастинг эти numpy массив к эти object тип:

>>> x = np.array(['s', 'b', 's', 'b']).astype(object)
>>> %time count = np.sum(np.equal('s', x))
>>> print("Count {} using numpy equal".format(count))
CPU times: user 50 µs, sys: 1 µs, total: 51 µs
Wall time: 55.1 µs
Count 2 using numpy equal

Быстрый и корректный!

0
ответ дан 1 November 2019 в 16:46

У меня был этот код, который вызывал ошибку:

for t in dfObj['time']:
  if type(t) == str:
    the_date = dateutil.parser.parse(t)
    loc_dt_int = int(the_date.timestamp())
    dfObj.loc[t == dfObj.time, 'time'] = loc_dt_int

я изменил его на это:

for t in dfObj['time']:
  try:
    the_date = dateutil.parser.parse(t)
    loc_dt_int = int(the_date.timestamp())
    dfObj.loc[t == dfObj.time, 'time'] = loc_dt_int
  except Exception as e:
    print(e)
    continue

для предотвращения сравнения, которое бросает предупреждение - как указано выше. Я только должен был избежать исключения из-за dfObj.loc в для цикла, возможно, существует способ сказать этому не проверять строки, которые это уже изменило.

0
ответ дан 1 November 2019 в 16:46

Другие вопросы по тегам:

Похожие вопросы: