2017-06-01 79 views
3

我已經做了一個例子,因爲我的數據集的內容和細節可能是太多/不必要的解釋,提供我的問題使用GROUPBY時,做一個加權和。雖然我的例子可能很愚蠢,但只要知道這個例子確實說明了我希望達到的目標(儘管規模要大得多),並且對於給定的問題非常重要。在這個例子中,假設我們有不同的用戶(用字母表示)。每個用戶共享多個帖子,並且不同的用戶經常共享相同的帖子。然後我們得出一個重要性分數(0或1表示是否重要)和可靠性分數(從1-10的等級)。儘管爲了解決這個問題而如何計算這些指標是完全不相關的,但想象一下重要性可能會分析內容和上下文/當前事件,並且可靠性會考慮到此來源/用戶的先前表現。至於是否有重要性和可靠性之間的關係目前尚不清楚如何在大熊貓

User  Share      Importance   Reliability 

A   Carrots are      0      3 
      good for eyesight 

B   Apple Cider Vinegar    1      4 
      is good for pain 

C   Garlic is good for breadth  0      7 

A   Garlic is good for breadth  1      6 
B   Carrots are good for eyesight 1      9 

的數字可能沒有什麼意義 - 道歉無論如何,我希望做一些權重的總和爲每個考慮到文本可靠性和重要性。爲此,我希望找到每個唯一文本(由共享列表示),並對共享該文本的所有用戶的重要性和可靠性分數進行求和。因此,我得到的是這樣的:

A 6 
B 13 
C 0 

我很想示例代碼,並建議如何解決這個問題!提前致謝。

+0

你可以做一個新的col 「重要性」和「可靠性」之間乘積的乘積。然後你可以通過'user'來'groupby'。 – arnold

+0

你在說你想要的 - 對於用戶共享的一些獨特文本,對每個用戶的重要性和可靠性評分的乘積求和。您的預期結果表似乎並未反映上述說法。相反,它會顯示所有帖子的產品總和,而不是唯一的帖子。國際海事組織,應該在預期的結果表中再增加一列 - 「共享」。 –

+0

非常感謝! –

回答

4

第一多個欄由mul然後groupby + sum

通過如Series柱的groupby優點是沒有臨時列是必要的。

df = pd.DataFrame({'User':['A','B','C','A','B'], 
        'Importance':[0,1,0,1,1], 
        'Reliability':[3,4,7,6,9]}) 
print (df) 
    Importance Reliability User 
0   0   3 A 
1   1   4 B 
2   0   7 C 
3   1   6 A 
4   1   9 B 

df1 = df.Importance.mul(df.Reliability).groupby(df['User']).sum().reset_index(name='col') 
print (df1) 
    User col 
0 A 6 
1 B 13 
2 C 0 
+0

非常感謝你! –

+0

很高興能幫助,祝你好運! – jezrael

1

只要做到:

df.groupby('User').apply(lambda g: (g.Importance*g.Reliability).sum()) 

或者你可以預先創建的產品列,只是總結說:

df['Score'] = df.Importance * df.Reliability 
df.groupby('User').Score.sum() 

(這些都假定一個用戶不共享相同的文章超過一次)

2

這是剛從

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 
+0

感謝分享! –

1

至於你的問題的措辭去,我想你想爲每一個獨特ImportanceReliability產品的總和,且每個獨特用戶

下面是類似的樣本數據幀到your's-

df = pd.DataFrame({'User':['A','B','C','A','B'],'Share':['Random Post 1','Random post 2','Random Post 3','Random Post 3','Random Post 1'], 'Importance':[0,1,0,1,1],'Reliability':[3,4,7,6,9]}) 
=> 
     Importance Reliability  Share  User 
0   0   3  Random Post 1 A 
1   1   4  Random post 2 B 
2   0   7  Random Post 3 C 
3   1   6  Random Post 3 A 
4   1   9  Random post 1 B 

首先得到一個新的列Product -

df['Product'] = df.Importance.mul(df.Reliability) 
=> 
     Importance Reliability  Share  User Product 
0   0   3  Random Post 1 A  0 
1   1   4  Random post 2 B  4 
2   0   7  Random Post 3 C  0 
3   1   6  Random Post 3 A  6 
4   1   9  Random post 1 B  9 

現在,只需按ShareUser和求和Product,從而獲得所需result-

df.groupby(['Share','User'])['Product'].sum().reset_index(name='Score') 
=> 
    Share  User 
Random Post 1 A  0 
       B  9 
Random Post 3 A  6 
       C  0 
Random post 2 B  4 
+0

感謝您的幫助! –

+0

如果這解決了你的問題,那麼你可以接受答案:-) –