Dataframe - как выполнять расчеты без использования для l oop? - PullRequest
1 голос
/ 11 января 2020

У меня есть pandas DataFrame

df = pd.DataFrame({"A": [10,20,30], "B": [20, 30, 10], "C": [20, 30, 10]})
df
    A   B  C
0   10  20 20
1   20  30 30
2   30  10 10

и другой ndarray w = array([0.2, 0.3, 0.4])

, как добавить столбец D так, чтобы его значение было точечным произведением каждая строка и w

, т.е. значение для D[0] будет равно np.dot(df.iloc[0],w) = 16

, значение для D[1] равно 25 (np.dot(df.iloc[1],w) = 25.

(Я думаю, apply() функция, но не знаю, как ее использовать, использование для l oop может быть неэффективным)

спасибо,

Ответы [ 2 ]

4 голосов
/ 11 января 2020

Вы можете сделать это, используя apply над строками (axis = 1) из pandas .DataFrame

>>> import pandas as pd
>>> import numpy as np
>>> df = pd.DataFrame({"A": [10,20,30], "B": [20, 30, 10], "C": [20, 30, 10]})
>>> w = np.array([0.2, 0.3, 0.4])
>>> df["D"] = df.apply(lambda p: np.dot(p.values, w), axis=1)
>>> df
    A   B   C     D
0  10  20  20  16.0
1  20  30  30  25.0
2  30  10  10  13.0

Хотя для повышения эффективности вы, вероятно, лучше превратить кадр данных в ndarray и использовать умножение матриц с matmul из numpy.

df["D"] = np.matmul(df.values, w)
2 голосов
/ 11 января 2020

Вы также можете использовать векторизованный подход, используя numpy широковещание :

df['D'] = np.sum(df.to_numpy() * w), axis=1)
'''
.to_numpy() is from version 0.24 if I remember correctly, before use .values
'''

df
    A   B   C     D
0  10  20  20  16.0
1  20  30  30  25.0
2  30  10  10  13.0

Выполнение анализа производительности в редакторе шпионов с использованием %timeit, вот что я получил от медленного до Самый быстрый:

%timeit (df * w).sum(axis=1)
2.15 ms ± 590 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit df.apply(lambda p: np.dot(p.values, w), axis=1)
900 µs ± 76.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit np.sum((df.to_numpy() * w), axis=1)
19.2 µs ± 481 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...