這是剛從
PROJECT
-------
KILL
項目矯枉過正...只是櫃面你沒有得到它。
請不要接受這個答案!這只是我玩得開心。是的,我相信這對其他許多人都有用。不,我不認爲這是必要的。 @ jezrael的答案是你想要的。
一個非常簡單的問題,使用numba
爲令人不安的優化
from numba import njit
import pandas as pd
import numpy as np
u = df.User.values
i = df.Importance.values
r = df.Reliability.values
f, q = pd.factorize(u)
@njit
def wghtd_sum(i, r, f):
o = np.zeros(f.max() + 1, dtype=np.int64)
for j in range(r.size):
o[f[j]] += r[j] * i[j]
return o
pd.DataFrame(dict(User=q, col=wghtd_sum(i, r, f)))
定時
微小的數據
%%timeit
u = df.User.values
i = df.Importance.values
r = df.Reliability.values
f, q = pd.factorize(u)
pd.DataFrame(dict(User=q, col=wghtd_sum(i, r, f)))
1000 loops, best of 3: 446 µs per loop
%timeit df.groupby('User').apply(lambda g: (g.Importance*g.Reliability).sum()).reset_index(name='col')
100 loops, best of 3: 2.51 ms per loop
%timeit df.Importance.mul(df.Reliability).groupby(df['User']).sum().reset_index(name='col')
1000 loops, best of 3: 1.19 ms per loop
大數據
from string import ascii_uppercase
np.random.seed([3,1415])
df = pd.DataFrame(dict(
User=np.random.choice(list(ascii_uppercase), 100000),
Importance=np.random.randint(2, size=100000),
Reliability=np.random.randint(10, size=100000)
))
%%timeit
u = df.User.values
i = df.Importance.values
r = df.Reliability.values
f, q = pd.factorize(u)
pd.DataFrame(dict(User=q, col=wghtd_sum(i, r, f)))
100 loops, best of 3: 2.45 ms per loop
%timeit df.groupby('User').apply(lambda g: (g.Importance*g.Reliability).sum()).reset_index(name='col')
100 loops, best of 3: 14.1 ms per loop
%timeit df.Importance.mul(df.Reliability).groupby(df['User']).sum().reset_index(name='col')
100 loops, best of 3: 4.45 ms per loop
你可以做一個新的col 「重要性」和「可靠性」之間乘積的乘積。然後你可以通過'user'來'groupby'。 – arnold
你在說你想要的 - 對於用戶共享的一些獨特文本,對每個用戶的重要性和可靠性評分的乘積求和。您的預期結果表似乎並未反映上述說法。相反,它會顯示所有帖子的產品總和,而不是唯一的帖子。國際海事組織,應該在預期的結果表中再增加一列 - 「共享」。 –
非常感謝! –