Панды извлекают обычную подстроку из 1 столбца в зависимости от условий в другом столбце - PullRequest
0 голосов
/ 11 октября 2019

У меня есть датафрейм, который выглядит следующим образом.

code    description          col3        col4
123456  nice shoes size4     something   something
123456  nice shoes size5     something   something
567890  boots size 1         something   something
567890  boots size 2         something   something
567890  boots size 3         something   something
234567 baby overall 2yrs     something.  something
234567 baby overall 3-4yrs     something  something
456778 shirt m     Something.   Something
456778 shirt l     something    Something
456778 shirt xl    Something   Something

Я хотел бы сократить «описание» до общей подстроки, основанной на аналогичном столбце «код». и отбросьте дубликаты.

code    description          col3        col4
123456  nice shoes          something   something
567890  boots               something   something
234567 baby overall    something    something
456778 shirt              Something   Something

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

from difflib import SequenceMatcher

string1 = "apple pie available"
string2 = "come have some apple pies"

def extract_common(string1, string2):
    match = SequenceMatcher(None, string1, string2).find_longest_match(0, len(string1), 0, len(string2))

    print(match)  # -> Match(a=0, b=15, size=9)
    print(string1[match.a: match.a + match.size])  # -> apple pie
    print(string2[match.b: match.b + match.size])  # -> apple pie
    return string1[match.a: match.a + match.size]

Цените любую оказанную помощь.

1 Ответ

0 голосов
/ 11 октября 2019

Вам нужны панды 0.25.1 , чтобы использовать взорваться

mask=(df.groupby('code')['code'].transform('size')>1)
df1=df[mask]
df2=df[~mask]
s=df1.groupby('code',sort=False)['description'].apply(lambda x: ' '.join(x).split(' ')).explode()
s_not_duplicates=s.to_frame()[s.map(s.value_counts()>1)].drop_duplicates().groupby(level=0)['description'].apply(lambda x: ' '.join(x))
description_not_duplicates=pd.concat([s_not_duplicates,df2.description])
print(description_not_duplicates)

123456      nice shoes
234567    baby overall
456778           shirt
567890      boots size
Name: description, dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...