Хранение строк только в том случае, если начало какой-либо строки не появляется более одного раза в наборе данных для определенных значений - PullRequest
0 голосов
/ 05 сентября 2018

Вот пример того, что я имею в Пандах:

    Name                        id    country
    Infinity War (extras)       null  ES
    Infinity War                18236 ES
    Infinity War (extras)       null  IT
    Batman V Superman (extras)  32512 UK
    Jurassic World              52130 FR
    Blade Runner (extra)        null  FR
    Blade Runner                5390  FR

Я хотел бы удалить «Бесконечность войны» (за дополнительную плату) «ES» и «Бегущий по лезвию клинка» (за дополнительную плату), поскольку название самого фильма появляется и для этой страны. Я нашел в функциях, таких как isin, starswith, findall, содержит ... но все они должны указать строку, которую вы ищете, и мне нужно удалить все из них без указания.

РЕДАКТИРОВАТЬ: Я нашел другое ограничение, которое я не знал. У меня также есть названия:

Ghostbusters (1984)
Ghostbusters (2016)

В этом случае ответы @Zero и @zipa не работают, поскольку они сохраняют только один фильм вместо обоих. Для того, чтобы решение @jpp работало, я изменил его, добавив опцию '(extra)' (которую я изначально не включил в вопрос):

m1 = df['Name'].str.endswith(' (extras)',' (extra)')

Применение кода jpp для каждой страны в отдельности решило мою проблему.

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Это будет хранить только самые короткие версии, основанные на начале:

df[df['A'].apply(lambda x: sum(1 for i in df['A'] if x.startswith(i)))==1]
#                            A      B
#1                Infinity War  18236
#2  Batman V Superman (extras)  32512
#3              Jurassic World  52130
0 голосов
/ 05 сентября 2018

Вы можете использовать комбинацию str.endswith и нарезки по индексу. Приведенное ниже решение удалит все вхождения 'SomeMovieName (extras)', где существует 'SomeMovieName'.

df = pd.DataFrame({'Name': ['Infinity War (extras)', 'Infinity War',
                            'Batman V Superman (extras)', 'Jurassic World'],
                   'ID': [np.nan, 18236, 32512, 52130]})

names = df['Name'].unique()

m1 = df['Name'].str.endswith(' (extras)')
m2 = df['Name'].str[:-9].isin(names)

res = df[~(m1 & m2)]

Результат

        ID                        Name
1  18236.0                Infinity War
2  32512.0  Batman V Superman (extras)
3  52130.0              Jurassic World
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...