Как изменить идентификаторы, указанные в одном кадре данных, на идентификаторы, которые будут сохранены после удаления дубликатов из второго кадра данных?

Я работаю с двумя фреймами данных:

df — содержит несколько строк с данными о научных статьях, включая magazine_id, который связан с ids во втором фрейме данных.

magazines - содержит только 2 столбца: id и title

В кадре данных magazines есть повторяющиеся заголовки.

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

df = pd.Dataframe({'id': [1003, 1009, 1010, 1034], 
               'title': ['Article1', 'Article2', 'Article3', 'Article4'],
              'magazine_id': [1, 2, 3, 4]})
magazines = pd.Dataframe({'id': [1, 2, 3, 4], 
               'title': ['Mag1','Mag1','Mag3','Mag4']})

Таким образом, из magazines запись с id = 2 следует удалить, потому что она имеет тот же заголовок, что и id = 1. Вывод для df должен быть:

id          title      magazine_id
1003    'Article1'      1
1009    'Article2'      1
1010    'Article3'      3
1034    'Article4'      4

Предоставьте образцы двух ваших фреймов данных и образец фрейма данных, содержащий ожидаемый результат?

richardec 19.03.2022 17:16

@keramat, вы изменили «строки» на «столбцы», но вы уверены, что это было намерением ОП? Я на самом деле тоже думал, что это ошибка, но если это не так... все ответы будут недействительными.

richardec 19.03.2022 17:30
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
24
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Поскольку ваш вопрос не ясен, я сделал сценарий. Если это ваш случай, я предлагаю сначала использовать merge dfs, а затем использовать drop_duplicates. См. следующее:

main_df = pd.DataFrame({'title_id':[1,2,3,4,5], 'authors': ['w', 'e', 'w','e','w']})
titles = pd.DataFrame({'id': [1,2,3,4,5], 'title': ['a', 'b', 'a', 'b','a']})
main_df.merge(titles, left_on='title_id', right_on='id').drop_duplicates(['title', 'authors'])

main_df:

заголовки df с дубликатами:

Результат:

Используйте drop_duplicates, чтобы избавиться от повторяющихся заголовков, и используйте ffill:

magazines = magazines.drop_duplicates(subset=['title'])
df.loc[~df['magazine_id'].isin(magazines['id']), 'magazine_id'] = np.nan
df['magazine_id'] = df['magazine_id'].ffill().astype(int)

Выход:

>>> df
     id     title  magazine_id
0  1003  Article1            1
1  1009  Article2            1
2  1010  Article3            3
3  1034  Article4            4

>>> magazines
   id title
0   1  Mag1
2   3  Mag3
3   4  Mag4
Ответ принят как подходящий
  • создали два фрейма данных, которые соответствуют вашей формулировке проблемы
  • de-dupe titles, сохраняя список использованных идентификаторов
  • затем карта (сливаться) для повторного выравнивания title_id второго кадра данных
import pandas as pd
import numpy as np

df = pd.DataFrame({"id": range(10), "title": np.random.choice(list("ABCDEFG"), 10)})
df2 = pd.DataFrame(
    {"content_id": range(100), "title_id": np.random.choice(range(10), 100)}
)

# drop duplicates, keep original ids as list
df = (
    df.groupby("title").agg(ids=("id", list)).reset_index().assign(id=lambda d: d.index)
)

# map title ids in second data frame to newly de-duped ids
df2 = (
    df.loc[:, ["id", "ids"]]
    .explode("ids")
    .merge(df2, left_on = "ids", right_on = "title_id")
    .drop(columns=["id", "title_id"])
    .rename(columns = {"ids": "title_id"})
)

Другие вопросы по теме