Сравнение значений в столбце df, извлечение совпадений в один столбец и различий в другой столбец - PullRequest
0 голосов
/ 04 сентября 2018

Привет и спасибо заранее, новичок в питоне и пандах.

  1. У меня есть столбец df df['name'], эти большие данные состоят из названий продуктов различной длины, букв, цифр, знаков препинания и пробелов. Это делает каждое имя уникальным, что затрудняет поиск вариантов некоторых продуктов.

  2. Затем я разделяю значения столбцов на интервалы.

    df['name'].str.split(" ",expand = True)

Я нашел некоторый код в этом Вопросе, но я не знаю, как применить его для итерации и сравнения списка с использованием переменных и списка 2, и у меня только один список. Как сравнить два списка в Python и вернуть совпадения ?

Not the most efficient one, but by far the most obvious way to do it is: a = [1, 2, 3, 4, 5] b = [9, 8, 7, 6, 5] set(a) & set(b) {5} if order is significant you can do it with list comprehensions like this: [i for i, j in zip(a, b) if i == j] [5]

  1. То, чего я пытаюсь достичь, это:

набор данных

1.star t-shirt-large-red 2.star t-shirt-large-blue 3.star t-shirt-small-red 4.beautiful rainbow skirt small 5.long maxwell logan jeans- light blue -32L-28W 6.long maxwell logan jeans- Dark blue -32L-28W

- сравнить все элементы списка друг с другом и найти совпадение самой длинной строки. Пример: продукты: 1,2,3 имеют соответствующие частичные строки result COL1 COL2 COL3 COL4 1[star t-shirt] [large] [red] NONE 2[star t-shirt] [large] [blue] NONE 3[star t-shirt] [small] [red] NONE 4[beautiful rainbow skirt small] NONE NONE NONE 5[long maxwell logan jeans] [light blue] [32L] [28W] 6[long maxwell logan jeans] [Dark blue] [32L] [28W]

Может ли кто-нибудь указать мне правильное направление в достижении моего конечного результата. Я исследовал такие модули, как fuzzywuzzy и diffilab, но не знаю, как применить его, а также regex, но я не уверен, как бы я достиг соответствия строк в списке с таким большим количеством различных форматов? Пожалуйста, при ответе вы можете объяснить это шаг за шагом, чтобы я мог понять, что вы делаете и почему. Просто для учебных целей Заранее спасибо еще раз.

1 Ответ

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

Ну, ваш вопрос действительно большой. Я думаю, что вы должны пересмотреть цель сделать это.

На первом шаге каждая строка соответствует друг другу.

df['onkey'] = 1
df1 = pd.merge(df[['name','onkey']],df[['name','onkey']], on='onkey')
df1['list'] = df1.apply(lambda x:[x.name_x,x.name_y],axis=1)

Второй шаг - найти совпадение самой длинной строки.

from os.path import commonprefix
df1['COL1'] = df1['list'].apply(lambda x:commonprefix(x))

Удалить строки, которые не находят совпадения.

df1['COL1_num'] = df1['COL1'].apply(lambda x:len(x))
df1 = df1[(df1['COL1_num']!=0)]

Найдите самое короткое совпадение.

df1 = df1.loc[df1.groupby('name_x')['COL1_num'].idxmin()]

Слияние df и df1.

df = df.rename(columns ={'name':'name_x'})
df = pd.merge(df,df1[['name_x','COL1']],on='name_x',how ='left')

Мы можем выглядеть так:

                                         name_x  onkey                           COL1
0                         star t-shirt-large-red      1                  star t-shirt-
1                        star t-shirt-large-blue      1                  star t-shirt-
2                         star t-shirt-small-red      1                  star t-shirt-
3                  beautiful rainbow skirt small      1  beautiful rainbow skirt small
4  long maxwell logan jeans- light blue -32L-28W      1     long maxwell logan jeans- 
5   long maxwell logan jeans- Dark blue -32L-28W      1     long maxwell logan jeans-

Как видите, мы нашли самое длинное совпадение строк.

Обрабатывает общую строку, и мы разделяем оставшуюся строку.

df['len'] = df['COL1'].apply(lambda x: len(x))
df['other'] = df.apply(lambda x: x.name_x[x.len:],axis=1)
df['COL1'] = df['COL1'].apply(lambda x: x.strip())
df['COL1'] = df['COL1'].apply(lambda x: x[:-1] if x[-1]=='-' else x)
df['other'] = df['other'].apply(lambda x:x.split('-'))

Наконец, мы приведем их в соответствие.

df = df[['COL1','other']]
df = pd.concat([df['COL1'],df['other'].apply(pd.Series)],axis=1)

Результат:

                            COL1            0     1    2
0                   star t-shirt        large   red  NaN
1                   star t-shirt        large  blue  NaN
2                   star t-shirt        small   red  NaN
3  beautiful rainbow skirt small                NaN  NaN
4       long maxwell logan jeans  light blue    32L  28W
5       long maxwell logan jeans   Dark blue    32L  28W
...