Какой самый быстрый способ обновить Dataframe, когда существуют сложные условия как для выбора, так и для обновления? - PullRequest
0 голосов
/ 01 февраля 2019

Как я могу оптимизировать скорость для обновления кадра данных, когда получение и установка условий сложны?

Следующий метод (с использованием .loc[]) кажется очень неэффективным:

import pandas as pd
import numpy as np

df = pd.DataFrame({'a': [0,0,0,0,1,3,1],
                   'b': [0,2,0,0,4,1,1],
                   'c': [0,0,0,0,1,1,1]})

# GET conditions
np.where(((df['a']==1)&(df['b']==df['a'])))

# SET conditions
np.where(((df['a']==0)&(df['b']>1)))

# Applying GET & SET conditions in update (using .loc[])- 3ms
df.loc[((df['a'] == 0)&(df['b']>1))] = df.loc[((df['a']==1)&(df['b']==df['a']))]

Могу ли яуменьшить время выполнения, используя df.values ​​& numpy при сохранении обоих этих условий выбора / обновления?

Обновление

Используя ответ jpp (импортируя df.values ​​в numpy и используя маски для выбора / обновления), операция выполнялась в ~ 5500 раз быстрее.

1 Ответ

0 голосов
/ 01 февраля 2019

Если Pandas слишком дорогой, рассмотрите возможность использования NumPy с расширенным логическим индексированием.

Если у вас есть только числовые серии, вам может повезти и вы сможете напрямую изменить базовый массив NumPy.Это, однако, не задокументировано и не рекомендуется.По сути, рекомендуется выполнять все ваши вычисления в NumPy и переходить к Pandas, только если / когда у вас есть конкретные задачи, подходящие для Pandas.

A = df.values
m1 = (A[:, 0] == 0) & (A[:, 1] > 1)
m2 = (A[:, 0] == 1) & (A[:, 1] == A[:, 0])

A[m1] = A[m2]

print(A)
# array([[0, 0, 0],
#        [1, 1, 1],
#        [0, 0, 0],
#        [0, 0, 0],
#        [1, 4, 1],
#        [3, 1, 1],
#        [1, 1, 1]], dtype=int64)

print(df)
#    a  b  c
# 0  0  0  0
# 1  1  1  1
# 2  0  0  0
# 3  0  0  0
# 4  1  4  1
# 5  3  1  1
# 6  1  1  1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...