Pandas:根据另一列计算累积的唯一值

时间:2017-03-24 13:07:10

标签: python loops dataframe unique

我有一个带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
    ...
    ...'

我需要按月计算唯一值并累计它们,但不计算现有ID。例如

    `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)`

谁能告诉我问题出在哪里?感谢

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

一种选择是编写for循环并使用set来保存累积唯一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