2015-04-21 68 views
0

我有了這個樣本數據幀df大熊貓 - 拆散用最頻繁的值多指標數據幀

GridCode,User,DLang 
3,224591119,es 
3,224591119,ja 
3,224591119,zh 
4,224591119,es 
6,146381773,en 
9,17925282,ca 

我想組User場,只保留最頻繁的DLang代碼,然後拆散和計數每個GridCode中的User的數字。到目前爲止,我所做的:

d = df.groupby(['GridCode','DLang']).size().unstack().fillna(0) 

其正確返回:

DLang  ca en es ja zh 
GridCode      
3   0 0 1 1 1 
4   0 0 1 0 0 
6   0 1 0 0 0 
9   1 0 0 0 0 

然而,正如你可以在df看到,有些用戶有多個DLang條目(例如用戶224591119),但我只想計算他們最常使用的DLang代碼(例如,該用戶的代碼是es)。所得到的數據幀將是:

DLang  ca en es 
GridCode      
3   0 0 1 
4   0 0 1 
6   0 1 0 
9   1 0 0 
+0

你想如何計算用戶224591119的GrideCode,因爲他在GrideCode 3和4都使用了'es'?有效地數他兩次,而不是四次? – Amyunimus

+0

此外,我認爲您提供的示例數據被幾行(僅有一個「ca」條目,而不是3條)切斷。我改變了這一點,但你可能想更新/檢查示例數據和結果數據幀。 – Amyunimus

回答

0

首先,計算特定DLang多少次發生,整個GridCode平均。

g = df.groupby(['User','DLang']).count().reset_index() 
g = g.rename(columns={'GridCode':'occurrences'}) 

然後,使用first()函數來查找每個用戶的最頻繁/最大發生次數。

h = g.groupby('User').first().reset_index() 

將原始輸入合併最頻繁/最大出現df。這其中,用戶使用DLang以外的最常見的

j = pd.merge(df,h, on=['User','DLang']) 

最後,跨用戶平均得到最終計數就會下降行。

final_df = j.groupby(['GridCode','DLang']).size().unstack().fillna(0) 

DLang  ca en es 
GridCode    
3   0 0 1 
4   0 0 1 
6   0 1 0 
9   1 0 0 
+0

感謝您的回答!關於您以前的評論,該數據框是正確的。我只是想爲每個用戶分配最常用的語言,而不管GridCode。然後,對於每個GridCode,計算每個網格中有多少用戶。所以在前面的例子中,在Grid 3中有一個'es'用戶和在Grid 4中有一個'es'用戶是正確的。 –