Панды: Как получить количество вхождений из другого фрейма данных? - PullRequest
1 голос
/ 09 октября 2019

Я использую Python Pandas. У меня есть 2 фрейма данных (а именно: df1, df2). «df1» содержит данные уровня заголовка, такие как идентификатор карты, дата выдачи и т. д. «df2» содержит данные уровня детализации, как и каждая транзакция, выполняемая конкретным идентификатором карты. «Идентификатор карты» является общим для двух фреймов данных.

df1:
 first_active_month          card_id  feature_1  feature_2  feature_3 
            2017-06  C_ID_92a2005557          5          2          1   
            2017-01  C_ID_3d0044924f          4          1          0   
            2016-08  C_ID_d639edf6cd          2          2          0   
            2017-09  C_ID_186d6a6901          4          3          0   
            2017-11  C_ID_cdbd2c0db2          1          3          0

df2:
   junk_id   authorized_flag          card_id  city_id Authorized 
    13292136               Y  C_ID_92a2005557      101          N   
    20069042               Y  C_ID_7a238b3713       69          N   
     5029656               Y  C_ID_92a2005557       17          N   
    16356907               N  C_ID_3d0044924f       -1          Y   
     8203441               Y  C_ID_fcf33361c2       17          N

Я хочу добавить столбец «частота» в df1, который будет показывать мне количество вхождений каждого идентификатора карты в df1 в df2. Итак, df1 должен выглядеть следующим образом:

df1 (after executing the command):
 first_active_month          card_id  feature_1  feature_2  feature_3    frequency
            2017-06  C_ID_92a2005557          5          2          1      2
            2017-01  C_ID_3d0044924f          4          1          0      5
            2016-08  C_ID_d639edf6cd          2          2          0      3
            2017-09  C_ID_186d6a6901          4          3          0      1
            2017-11  C_ID_cdbd2c0db2          1          3          0      7

Обратите внимание: я новичок в Python / Pandas. Я уже просмотрел несколько потоков этого сайта, но все они ссылались на подсчет в одном кадре данных. Я ищу подсчет с использованием функции объединения / слияния. Темы, которые я уже просмотрел: это , это , это , это , это , это , это .

Ответы [ 2 ]

2 голосов
/ 09 октября 2019

Я думаю, вам нужно Series.map с Series.value_counts и Series.fillna для замены отсутствующих значений:

df1['frequency'] = df1['card_id'].map(df2['card_id'].value_counts()).fillna(0).astype(int)
print (df1)
  first_active_month          card_id  feature_1  feature_2  feature_3  \
0            2017-06  C_ID_92a2005557          5          2          1   
1            2017-01  C_ID_3d0044924f          4          1          0   
2            2016-08  C_ID_d639edf6cd          2          2          0   
3            2017-09  C_ID_186d6a6901          4          3          0   
4            2017-11  C_ID_cdbd2c0db2          1          3          0   

   frequency  
0          2  
1          1  
2          0  
3          0  
4          0  
1 голос
/ 09 октября 2019

На самом деле, в вашем вопросе есть часть ответа. Сначала нужно посчитать частоту:

df3 = df2.groupby(["card_id"], as_index=False)[["junk_id"]].count().rename(columns={"junk_id":"frequency"})

Переименование необходимо, поскольку pandas оставляет имена столбцов после операции groupby без изменений. Затем вы можете объединить ваши dfs:

df1 = df1.merge(df3, how='left', on='card_id')

И вы можете сделать это в одну строку, подставив df3 в оператор слияния.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...