np.where не работает корректно и нужен более быстрый способ панды, применить - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь добавить новый столбец значений true и false в больший массив данных в зависимости от того, существует ли комбинация значений других столбцов в другом кадре данных или массиве.

Сначала я попробовал это:

Activity = pd.DataFrame(list(itertools.product(ActivityLog1['_created_at$AL'].unique(), _User['_p_user'].unique())),\
                     columns = ['date','_p_user'])
dft = ActivityLog1[['_created_at$AL','_p_user']].values
Activity['active'] = Activity.apply(lambda x: x[['date','_p_user']].values in dft,axis=1)

Но это заняло столько времени, сколько строк данных, поэтому я изменил функцию применения на это:

Activity['active'] = np.where(Activity[['date','_p_user']].values in dft, True, False)

Я получаю это предупреждение:

C:\Anaconda3\lib\site-packages\ipykernel_launcher.py:6: DeprecationWarning: elementwise == comparison failed; this will raise an error in the future.

Также все возвращаемые значения являются ложными, что не соответствует действительности.

Activity[['date','_p_user']].values

возвращает:

array([[Timestamp('2018-03-27 00:00:00'), 'Y5RKervPy0'],
       [Timestamp('2018-03-27 00:00:00'), 'G3zTYHC9qj'],
       [Timestamp('2018-03-27 00:00:00'), 'BeLqAK02Zo'],
       ...,
       [Timestamp('2018-09-03 00:00:00'), 'mSEZo8qHe2'],
       [Timestamp('2018-09-03 00:00:00'), 'zrERaksxxg'],
       [Timestamp('2018-09-03 00:00:00'), '7q6EuwbCgj']], dtype=object)

и

dft

возвращает:

array([[Timestamp('2018-03-27 00:00:00'), 'BoMRF4HvNg'],
       [Timestamp('2018-03-27 00:00:00'), 'B2QoOpL3dZ'],
       [Timestamp('2018-03-27 00:00:00'), '7G2jZJbzjT'],
       ...,
       [Timestamp('2018-08-17 00:00:00'), 'dMH2WDsbDY'],
       [Timestamp('2018-08-27 00:00:00'), 'sW13lwCQEF'],
       [Timestamp('2018-09-03 00:00:00'), 'RAJOMMfWH9']], dtype=object)

Есть ли еще лучший и / или более быстрый способ добиться этого?Спасибо.

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Как насчет слияния, используя аргумент indicator:

Activity = Activitity.merge(dft.drop_duplicates(), indicator='active', how='left')
Activity['active'] = Activity.active.map({'both': True, 'left_only': False})

.drop_duplicates() должен гарантировать, что размер левого кадра остается неизменным после слияния.Вы можете удалить его (что улучшит скорость), если вы уверены, что dft не содержит дубликатов.

0 голосов
/ 24 сентября 2018

Это больше похоже на isin проблему

Activity['active']=Activity[['date','_p_user']].apply(tuple,1).isin(dft.apply(tuple,1))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...