这是刚从
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
你在说你想要的 - 对于用户共享的一些独特文本,对每个用户的重要性和可靠性评分的乘积求和。您的预期结果表似乎并未反映上述说法。相反,它会显示所有帖子的产品总和,而不是唯一的帖子。国际海事组织,应该在预期的结果表中再增加一列 - “共享”。 –
非常感谢! –