Как подсчитать количество уникальных элементов в столбце в кадре данных Pandas - PullRequest
2 голосов
/ 17 июня 2020

Допустим, у меня есть фрейм данных, в котором записан покупатель (обозначенный буквой) и дата, когда он прибыл в магазин.

    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 () к этому новому столбцу (для каждого дня), чтобы получить желаемый результат.

У меня проблемы с кодом, который принимает значение в столбце «клиент» и сравнивает его. к каждому другому значению в столбце, чтобы определить, является ли оно первым в своем роде - или это вообще необходимо?

Ответы [ 2 ]

3 голосов
/ 17 июня 2020

попробуйте это, 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
0 голосов
/ 17 июня 2020

Используйте 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...