Наиболее оптимизированный способ выполнения расчетов в строках списков разных размеров - PullRequest
2 голосов
/ 13 февраля 2020

С учетом следующего кадра данных:

df = pd.DataFrame({'list_col': [np.random.randint(0,100,size=(1, np.random.randint(0,10)))[0] for i in range(100000)]})

enter image description here

Каков оптимальный способ возврата суммы каждой строки? (пустые строки = 0)

Я читал, что использование .apply обычно не рекомендуется в pandas

df.list_col.apply(sum)

enter image description here

Однако , когда я пытался правильно использовать векторизованные вычисления, мне удалось получить только следующее:

np.nansum(pd.DataFrame(df.list_col.values.tolist()).values, axis=1)

, которое оказалось медленнее: enter image description here

Итак, как правильно использовать векторизованные вычисления numpy для массива списков различных размеров?

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Рассмотрим скорость list с map немного быстрее, чем у других

%timeit df.list_col.apply(sum)
10 loops, best of 3: 130 ms per loop
%timeit np.nansum(pd.DataFrame(df.list_col.values.tolist()).values, axis=1)
1 loop, best of 3: 169 ms per loop
%timeit list(map(sum,df.list_col.tolist()))
10 loops, best of 3: 93.6 ms per loop
0 голосов
/ 13 февраля 2020

Я думаю, что ваш подход довольно оптимизирован, вы можете сэкономить несколько миллисекунд

%timeit df['list_col'].map(sum)
162 ms ± 5.34 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit df['list_col'].apply(sum)
156 ms ± 747 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit df['list_col'].map(np.sum)
306 ms ± 3.51 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

Я предпочитаю использовать map, когда это series операция, так как apply обычно используется для dataframes.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...