Pandas: сохраняйте столбец, подсчитывайте, удаляйте дубликаты

#python #pandas

#python #pandas

Вопрос:

В настоящее время я пытаюсь удалить дубликаты в соответствии с двумя столбцами, но подсчитайте дубликаты, прежде чем они будут удалены. Мне удалось сделать это с помощью

df_interactions = df_interactions.groupby(['user_id','item_tag_ids']).size().reset_index()
.rename(columns={0:'interactions'})

но это оставляет меня с

    user_id  item_tag_ids  interactions
0      170            71             1
1      170           325             1
2      170           387             1
3      170           474             1
4      170           526             2
  

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

Вот исходная структура, я хочу группировать только по идентификаторам:

    user_id  item_tag_ids  item_timestamp
0   406225          7271      1483229353
1   406225          1183      1483229350
2   406225          5930      1483229350
3   406225          7162      1483229350
4   406225          7271      1483229350
  

Я хотел бы, чтобы новое item_timestamp поле в меньшем фрейме данных содержало первую встречающуюся временную метку для этой комбинации.

Комментарии:

1. Какова была первоначальная структура?

2. @micric Я пытаюсь сохранить столбец item_timestamp после удаления дубликатов. Итак, в основном группируйте по этим идентификаторам, подсчитывайте взаимодействия (дубликаты перед удалением), добавляйте item_timestamps после удаления дубликатов.

3. @kuomi поймите, что мы не сможем вам помочь, если вы раньше не включите пример исходных данных groupby .

4. Каков ожидаемый результат от вашей исходной структуры?

Ответ №1:

Вы хотите использовать transform следующее, чтобы сохранить форму ваших исходных данных.

И чтобы получить список значений всех item_stamps, вы можете использовать groupby в сочетании с agg(list)

 # First we create count column with transform
df['count'] = df.groupby(['user_id', 'item_tag_ids']).user_id.transform('size')

# AFter that we merge our groupby with apply list back to our original dataframe
df = df.merge(df.groupby(['user_id', 'item_tag_ids']).item_timestamp.agg(list).reset_index(), 
              on=['user_id', 'item_tag_ids'], 
              how='left',
                  suffixes=['_1', '']).drop('item_timestamp_1', axis=1)

print(df)
   user_id  item_tag_ids  count            item_timestamp
0   406225          7271      2  [1483229353, 1483229350]
1   406225          1183      1              [1483229350]
2   406225          5930      1              [1483229350]
3   406225          7162      1              [1483229350]
4   406225          7271      2  [1483229353, 1483229350]
  

Объяснение того, .agg(list) что он объединяет значения группы в список, подобный следующему:

 df.groupby(['user_id', 'item_tag_ids']).item_timestamp.agg(list).reset_index()
Out[39]: 
   user_id  item_tag_ids            item_timestamp
0   406225          1183              [1483229350]
1   406225          5930              [1483229350]
2   406225          7162              [1483229350]
3   406225          7271  [1483229353, 1483229350]
  

Комментарии:

1. Прошу прощения, я приложил оригинальную структуру к своему вопросу

2. Я могу преобразовать размер, но при этом удаляются остальные столбцы, я хочу, чтобы item_timestamp также удалялись их дубликаты, но если я сгруппирую по всем трем, я получу другой размер структуры, поскольку некоторые временные метки повторяются

3. Отредактированный ответ, это то, чего вы хотите? @kuomi

4. Похоже, что это сохраняет исходную структуру, но добавляет количество. Что я ищу, так это сгруппировать по первым двум столбцам, а затем получить временные метки для того, что осталось. Группировка урезает мой фрейм данных с 236268 до 31548, поэтому то, что я ищу, — это связанные временные метки для каждого индекса в новом фрейме данных.

5. Извините, если я не был ясен, я хочу группировку уникальных комбинаций user_id, item_tag_ids, но счетчик того, сколько раз появлялись дубликаты. Затем я хочу, чтобы для каждой из уникальных комбинаций из исходного DF были впервые встречающиеся временные метки