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