如何计算 Pandas 数据框中一列中唯一元素的数量

How to count the number of unique elements in a column in a Pandas dataframe

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

    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' 列中获取一个值并将其与该列中的每个其他值进行比较以确定它是否是同类中的第一个 - 或者这是否是有必要吗?

使用crosstab将其转换为每个客户在每个日期存在的DataFrame。使用 cummax 我们可以向前填写所有日期,因为它们出现了,这变成了一个简单的 sum 来获得独特的客户。

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_duplicatesgroupby

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