Df.drop_duplicates не работает, что я делаю не так?

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

    SearchTerm  Start   End
0   ITEM 1. 7219    47441.0
1   ITEM 2. 47441   57712.0
2   ITEM 3. 57712   76730.0
3   ITEM 4. 76730   106927.0
4   ITEM 5. 106927  111973.0
5   ITEM 6. 111973  120362.0
6   ITEM 7. 120362  237727.0
7   ITEM 8. 237727  830655.0
8   ITEM 9. 830655  833033.0
9   ITEM 10.    833033  833709.0
10  ITEM 11.    833709  834662.0
11  ITEM 12.    834662  846594.0
12  ITEM 13.    846594  847172.0
13  ITEM 14.    847172  849550.0
14  ITEM 15.    849550  877408.0
15  Item 15.    877408  913873.0
16  ITEM 1. 913873  914661.0
17  ITEM 2. 914661  914735.0
18  ITEM 3. 914735  914816.0
19  ITEM 4. 914816  915164.0
20  ITEM 6. 915164  915290.0
21  ITEM 7. 915290  915640.0
22  ITEM 8. 915640  917398.0
23  ITEM 9. 917398  917637.0
24  ITEM 10.    917637  917752.0
25  ITEM 11.    917752  917878.0
26  ITEM 12.    917878  918005.0
27  ITEM 13.    918005  918116.0
28  ITEM 14.    918116  918316.0
29  ITEM 15.    918316  919863.0

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

я пытался:

df2= matches_array.drop_duplicates(subset=["SearchTerm"],keep='last',inplace=True)

df2= matches_array.drop_duplicates(subset=["SearchTerm"],keep='last',inplace=False)

matches_array.drop_duplicates(subset=["SearchTerm"],keep="last",inplace=False)

matches_array.drop_duplicates(subset=['SearchTerm'],keep='last',inplace=True)

и несколько других вариантов с индексом игнорирования, но я не могу заставить его работать. Что я делаю не так?

редактировать:

{'SearchTerm': ['ITEM\xa01.', 'ITEM\xa02.', 'ITEM\xa03.',
'ITEM\xa04.', 'ITEM\xa05.', 'ITEM\xa06.', 'ITEM\xa07.',
'ITEM\xa08.', 'ITEM\xa09.', 'ITEM\xa010.', 'ITEM\xa011.',
'ITEM\xa012.', 'ITEM\xa013.', 'ITEM\xa014.', 'ITEM\xa015.',
'Item\xa015.', 'ITEM 1.', 'ITEM 2.', 'ITEM 3.', 'ITEM 4.',
'ITEM 6.', 'ITEM 7.', 'ITEM 8.', 'ITEM 9.', 'ITEM 10.',
'ITEM 11.', 'ITEM 12.', 'ITEM 13.', 'ITEM 14.', 'ITEM 15.'], 'Start': [7219, 47441, 57712, 76730, 106927, 111973,
120362, 237727, 830655, 833033, 833709, 834662, 846594,
847172, 849550, 877408, 913873, 914661, 914735, 914816,
915164, 915290, 915640, 917398, 917637, 917752, 917878,
918005, 918116, 918316], 'End': [47441.0, 57712.0, 76730.0, 106927.0, 111973.0, 120362.0, 237727.0, 830655.0, 833033.0, 833709.0, 834662.0, 846594.0, 847172.0, 849550.0, 877408.0, 913873.0, 914661.0, 914735.0, 914816.0, 915164.0, 915290.0, 915640.0, 917398.0, 917637.0, 917752.0, 917878.0, 918005.0, 918116.0, 918316.0, 919863.0]}

Ваш ввод неоднозначен, можете ли вы предоставить вывод matches_array.to_dict('list')?

mozway 06.04.2022 20:05

что значит двусмысленно. я проверил строки, они идентичны (без пробелов или чего-то еще)

Zwink 06.04.2022 20:07

{'SearchTerm': ['ITEM\xa01.', 'ITEM\xa02.', 'ITEM\xa03.', 'ITEM\xa04.', 'ITEM\xa05.', 'ITEM\xa06.', 'ITEM \xa07.', 'ПУНКТ\xa08.', 'ПУНКТ\xa09.', 'ПУНКТ\xa010.', 'ПУНКТ\xa011.', 'ПУНКТ\xa012.', 'ПУНКТ\xa013.', 'ПУНКТ\ xa014.', 'ПУНКТ\xa015.', 'Элемент\xa015.', 'ПУНКТ 1.', 'ПУНКТ 2.', 'ПУНКТ 3.', 'ПУНКТ 4.', 'ПУНКТ 6.', 'ПУНКТ 6.' 7.», «ПОЗИЦИЯ 8.», «ПОЗИЦИЯ 9.», «ПОЗИЦИЯ 10.», «ПОЗИЦИЯ 11.», «ПОЗИЦИЯ 12.», «ПОЗИЦИЯ 13.», «ПОЗИЦИЯ 14.», «ПОЗИЦИЯ 15. '], 'Начинать': [

Zwink 06.04.2022 20:10

Вы можете указать это как редактировать в вопросе?

mozway 06.04.2022 20:15

сделано, но я уже вижу, что происходит какое-то странное кодирование. пространство не пространство или что-то в этом роде.

Zwink 06.04.2022 20:23

что же с этим делать?

Zwink 06.04.2022 20:32

эти коды (\xa0 — неразрывный пробел) делают ваши строки визуально идентичными, но на самом деле разными, см. мой ответ, чтобы узнать, как их удалить.

mozway 06.04.2022 20:38

Вы хотите сохранить последнее значение на основе max(Start) или max(End)? Если это так, почему бы не использовать group by?

Gouri 06.04.2022 20:50
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
0
8
31
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

IIUC, вы можете заменить свои коды \xa0 (неразрывные пробелы) обычными пробелами и сделать строки в верхнем регистре:

df['SearchTerm'] = df['SearchTerm'].str.replace('\xa0', ' ').str.upper()

df2 = df.drop_duplicates(subset=["SearchTerm"], keep='last')

выход:

   SearchTerm   Start       End
4     ITEM 5.  106927  111973.0
16    ITEM 1.  913873  914661.0
17    ITEM 2.  914661  914735.0
18    ITEM 3.  914735  914816.0
19    ITEM 4.  914816  915164.0
20    ITEM 6.  915164  915290.0
21    ITEM 7.  915290  915640.0
22    ITEM 8.  915640  917398.0
23    ITEM 9.  917398  917637.0
24   ITEM 10.  917637  917752.0
25   ITEM 11.  917752  917878.0
26   ITEM 12.  917878  918005.0
27   ITEM 13.  918005  918116.0
28   ITEM 14.  918116  918316.0
29   ITEM 15.  918316  919863.0
How about using group by to pick the last one? (You can change the max of End if that's what you want)

df = pd.read_csv("/tmp/Book2.csv")
    
df.sort_values(by=['Search Term', 'Start']).groupby('Search Term').max('Start')



      

    
Search Term   Start     End             
ITEM 1       913873  914661
ITEM 10      917637  917752
ITEM 11      917752  917878
ITEM 12      917878  918005
ITEM 13      918005  918116
ITEM 14      918116  918316
ITEM 15      918316  919863
ITEM 2       914661  914735
ITEM 3       914735  914816
ITEM 4       914816  915164
ITEM 5       106927  111973
ITEM 6       915164  915290
ITEM 7       915290  915640
ITEM 8       915640  917398
ITEM 9       917398  917637

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