我有一个带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)`
谁能告诉我问题出在哪里?感谢
答案 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})