Python 熊猫:根据另一列计算累积的唯一值
我有一个带有ID和日期的简单数据框,如下所示:Python 熊猫:根据另一列计算累积的唯一值,python,loops,dataframe,unique,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 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)`
`df['date']中的d。删除重复项()
c=df[df['date']您应该使用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
一个选项是编写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})
因此,如果a
在同一个月内出现两次,则只计算一次,对吗?此外,您的所有日期都列为该月的第一个日期吗?我需要计算从最早日期到当前的唯一ID。按组计算该期间的唯一ID,这无法满足我的需要谢谢您的代码。我现在无法尝试,但请继续ems它会工作的。实际上我还是Python新手,你能给我一些关于“set”的信息吗?它工作,非常感谢。但是理解“set”仍然很好