Python 如何计算数据帧中列中唯一元素的数量

Python 如何计算数据帧中列中唯一元素的数量,python,pandas,dataframe,unique,Python,Pandas,Dataframe,Unique,假设我有一个数据框,记录客户(用字母表示)和他们到达商店的日期 customer date A 2010-01-01 B 2010-01-01 A 2010-01-02 C 2010-01-02 D 2010-01-03 D 2010-01-03 我想计算进入商店的独特客户的数量,并显示每天独特客户的累计数量

假设我有一个数据框,记录客户(用字母表示)和他们到达商店的日期

    customer       date
       A        2010-01-01
       B        2010-01-01
       A        2010-01-02
       C        2010-01-02
       D        2010-01-03
       D        2010-01-03
我想计算进入商店的独特客户的数量,并显示每天独特客户的累计数量。所以我不想重复计算一个过去已经在店里的顾客

所需的输出如下:

     date         cumulative unique customers to date
  2010-01-01                     2   # A, B
  2010-01-02                     3   # A, B, C
  2010-01-03                     4   # A, B, C, D
因此,3天后,我们有4个不同的客户到达

到目前为止,我最接近的方法是使用
groupby()
函数:

df.groupby('Date')['Customer'].nunique()
这让我

     date                 unique customers per date
  2010-01-01                     2   # A, B
  2010-01-02                     2   # A, C
  2010-01-03                     1   # D
然而,这只是每天唯一客户的数量

我想我需要创建一个新列和一个函数,该函数遍历每一行,如果客户第一次访问该行,则在新列中放入1,否则为0。然后对这个新列(每天)应用cumsum()方法以获得所需的结果


我在编写代码时遇到了一些问题,这些代码在“customer”列中获取一个值,并将其与该列中的每个其他值进行比较,以确定它是否是同类中的第一个值,或者这是否是必要的?

使用
交叉表
将其转换为每个客户在每个日期存在的数据帧。使用
cummax
我们可以填写所有日期,因为它们出现了,这将成为一个简单的
总和
,以获得独特的客户

pd.crosstab(df.date, df.customer).clip(upper=1)
#customer    A  B  C  D
#date                  
#2010-01-01  1  1  0  0
#2010-01-02  1  0  1  0
#2010-01-03  0  0  0  1

pd.crosstab(df.date, df.customer).clip(upper=1).cummax()
#customer    A  B  C  D
#date                  
#2010-01-01  1  1  0  0
#2010-01-02  1  1  1  0
#2010-01-03  1  1  1  1

pd.crosstab(df.date, df.customer).clip(upper=1).cummax().sum(1)
#date
#2010-01-01    2
#2010-01-02    3
#2010-01-03    4
#dtype: int64

尝试此操作,
drop_duplicates
groupby

>>> df.drop_duplicates(["customer"]).groupby("date")['customer'].nunique().cumsum()
date
2010-01-01    2
2010-01-02    3
2010-01-03    4
Name: customer, dtype: int64