2017-03-24 202 views
0

我有ID和日期一個簡單的數據幀,如下面積累獨特的價值觀:熊貓:計數基於另一列

'ID Date 
    a 2009/12/1 
    c 2009/12/1 
    d 2009/12/1 
    a 2010/4/1 
    c 2010/5/1 
    e 2010/5/1 
    b 2010/12/1 
    b 2012/3/1 
    e 2012/7/1 
    b 2013/1/1 
    ... 
    ...' 

我需要每個月來算獨特的價值觀和積累他們,但不包括現有標識。例如

`2009/12/1 3 
    2010/4/1 3 
    2010/5/1 4 
    ... ...` 

我創建了一個循環,但沒有工作

 `for d in df['date'].drop_duplicates(): 
     c=df[df['date']<=d].ID.nunique() 
     df2=DataFrame(data=c,index=d)` 

誰能告訴我問題出在哪裏?謝謝

+0

所以如果'了'在同一個月中出現兩次,這是隻計算一次,對嗎?另外,你所有的日期都是本月的第一個日期嗎? – James

回答

0

一種選擇是寫一個for循環並使用一組保存的累積唯一ID:

cumcount = [] 
cumunique = set() 
date = [] 
for k, g in df.groupby(pd.to_datetime(df.Date)): 
    cumunique |= set(g.ID)     # hold cumulative unique IDs 
    date.append(g.Date.iat[0])    # get the date variable for each group 
    cumcount.append(len(cumunique))   # hold cumulative count of unique IDs 

pd.DataFrame({"Date": date, "ID": cumcount}) 

enter image description here

+0

謝謝你的代碼。我目前無法嘗試,但似乎會奏效。其實我對Python還是很陌生,你能給我一些關於'set'的信息嗎? – Baiii

+0

它的工作原理,非常感謝。但仍然很好理解什麼是「設置」 – Baiii

0

你應該使用groupby()而不是循環你的數據幀。按日期列分組後,您可以使用數ID的唯一實例:

df.groupby('Date')['ID'].nunique() 

簡單的例子:

df = pd.DataFrame([['a' ,'2009/12/1'], 
        ['c' ,'2009/12/1'], 
        ['d' ,'2009/12/1'], 
        ['c' ,'2009/12/1'], 
        ['a' ,'2010/4/1'], 
        ['c' ,'2010/5/1'], 
        ['e' ,'2010/5/1']], columns = ['ID','Date']) 

df.groupby('Date')['ID'].nunique() 
# returns: 
# Date 
# 2009/12/1 3 
# 2010/4/1  1 
# 2010/5/1  2 
+0

我需要計算從最早的日期到當前的唯一ID。通過計數唯一的ID在那段時間不能滿足我的需求 – Baiii