2017-03-24 29 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