2016-02-21 171 views
1

我有一個熊貓數據幀像以下一些條件..如何計算比對大熊貓數據幀

date       item_id 
2016-01-19      [188, 188] 
2016-01-23      [188, 142] 
2016-02-05      [188, 264] 
2016-02-06 [273, 248, 191, 167, 238, 191] 
2016-02-15       [320] 
2016-02-17       [286] 
2016-02-20      [164, 317] 

在上面我想計算因此,在上述情況下item_id 188重複3次在3 No of times the item_id got repeated on different dates/no of unique item_id的比例不同天,這樣的比值將是 3/no of unique item_id3/13

代碼來創建一個數據幀

buyer_id item_id  date 
261_23  188 2016-01-19 
261_23  188 2016-01-19 
261_23  188 2016-01-23 
261_23  142 2016-01-23 
261_23  188 2016-02-05 
261_23  264 2016-02-05 
261_23  273 2016-02-06 
261_23  248 2016-02-06 
261_23  191 2016-02-06 
261_23  167 2016-02-06 
261_23  238 2016-02-06 
261_23  191 2016-02-06 
261_23  320 2016-02-15 
261_23  286 2016-02-17 
261_23  164 2016-02-20 
261_23  317 2016-02-20 

df.groupby(['date','buyer_id'])['item_id'].apply(lambda x: x.tolist()) 

回答

2

集合的所有獨特的項目聯盟是

unique_items = set().union(*df.item_id.apply(set)) 

每個項目的出現次數爲

num_appearances = [df.item_id.apply(lambda s: k in s).sum() for k in unique_items] 

因此,下面將創建一個字典映射每個項目你問的比:

dict((k, n/float(len(unique_items))) \ 
    for (k, n) in zip(unique_items, num_appearances)) 

Examp樂

import pandas as pd 

df = pd.DataFrame({ 
    'date': range(5), 
    'item_id': [[188, 188], [188, 142], [188, 264], [273, 248, 191, 167, 238, 191], [320]]}) 

unique_items = set().union(*df.item_id.apply(set)) 
>>> unique_items 
{142, 167, 188, 191, 238, 248, 264, 273, 320} 

num_appearances = [df.item_id.apply(lambda s: k in s).sum() for k in unique_items] 
>>> num_appearances 
[1, 1, 1, 1, 1, 1, 1, 3, 1] 

>>> dict((k, n/float(len(unique_items))) \ 
    for (k, n) in zip(unique_items, num_appearances)) 
{142: 0.1111111111111111, 
167: 0.1111111111111111, 
188: 0.33333333333333331, 
191: 0.1111111111111111, 
238: 0.1111111111111111, 
248: 0.1111111111111111, 
264: 0.1111111111111111, 
273: 0.1111111111111111, 
320: 0.1111111111111111} 
+0

它給我'num_appearances'爲'[1,1,1,1,1,1,1,1,1,1,1,1]''但有188' 3項 – Neil

+0

@Neil添加了我試過的DataFrame +代碼,你可以看到它不會統一輸出1。如果您發佈了創建DataFrame的確切代碼(*不是*您的問題中的prinout),我也可以運行它。就目前而言,我無法確定您的DataFrame與我的區別。 –

+0

它返回我最終輸出爲'{ '142':0.083333333333333329, '164':0.083333333333333329, '167':0.083333333333333329, '188':0.083333333333333329, '191':0.083333333333333329, '238':0.083333333333333329, '248':0.083333333333333329, '264':0.083333333333333329, '273':0.083333333333333329, '286':0.083333333333333329, '317':0.083333333333333329, '320':0.083333333333333329}' – Neil