Я работаю с двумя фреймами данных:
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
@keramat, вы изменили «строки» на «столбцы», но вы уверены, что это было намерением ОП? Я на самом деле тоже думал, что это ошибка, но если это не так... все ответы будут недействительными.
Поскольку ваш вопрос не ясен, я сделал сценарий. Если это ваш случай, я предлагаю сначала использовать 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
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"})
)
Предоставьте образцы двух ваших фреймов данных и образец фрейма данных, содержащий ожидаемый результат?