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

Как заменить значение строки детали столбца другим столбцом.

Мой DataSet здесь:

ID          Product Name                            Size ID    Size Name
1   24 Mantra Ancient Grains Foxtail Millet 500 gm      1       500 gm
2   24 Mantra Ancient Grains Little Millet 500 gm       2       500 gm
3   24 Mantra Naturals Almonds 100 gm                   3       100 gm
4   24 Mantra Naturals Kismis 100 gm                    4       100 gm
5   24 Mantra Organic Ajwain 100 gm                     5       100 gm
6   24 Mantra Organic Apple Blast Drink 250 ml          6       250 ml
7   24 Mantra Organic Apple Juice 1 Ltr Tetra Pack      7       1000 ml
8   24 Mantra Organic Apple Juice 200 ml                8       200 ml
9   24 Mantra Organic Assam Tea 100 gm                  9       100 gm

Требование здесь - значение столбца Product Name равно 24 Mantra Ancient Grains Foxtail Millet 500 gmи столбец Size Name имеет 500 Gm.В этом случае мой вывод будет 24 Mantra Ancient Grains Foxtail Millet.Если Size Name содержится в строке Product Name, удалите слово имени размера, игнорируя регистр, иначе не нужно предпринимать никаких действий.

Ответы [ 3 ]

0 голосов
/ 10 октября 2018

Предполагая, что вы size name всегда будете последним столбцом, вот что я думаю вам нужно:

import re

data = '''ID          Product Name                            Size ID    Size Name
1   24 Mantra Ancient Grains Foxtail Millet 500 gm      1       500 gm
2   24 Mantra Ancient Grains Little Millet 500 gm       2       500 gm
3   24 Mantra Naturals Almonds 100 gm                   3       100 gm
4   24 Mantra Naturals Kismis 100 gm                    4       100 gm
5   24 Mantra Organic Ajwain 100 gm                     5       100 gm
6   24 Mantra Organic Apple Blast Drink 250 ml          6       250 ml
7   24 Mantra Organic Apple Juice 1 Ltr Tetra Pack      7       1000 ml
8   24 Mantra Organic Apple Juice 200 ml                8       200 ml
9   24 Mantra Organic Assam Tea 100 gm                  9       100 gm
'''
def cleaner(txt):
    data = txt
    temp = data.split('\n')
    products = temp[1:-1]
    fixed_products = [temp[0]]

    for p in products:
    res = re.search('(\d+\s\w*)$', p)
    try:
        match = res.group(0)
        ignore_from = len(match)
        found_at = p[:-ignore_from].find(match)
        if found_at > -1:#we found a duplicate
            fixed_product = p.replace(match,'',1)
            fixed_products.append(fixed_product)
    except:
        pass
    products = '\n'.join(fixed_products)
    return products

#Example
#cleaner(data)

Here is the result

0 голосов
/ 10 октября 2018

IIUC, вы можете использовать apply() и replace():

df['Product Name'] = df.apply(lambda x: x['Product Name'].replace(x['Size Name'], '').strip(), axis=1)

Выход:

   ID                                    Product Name  Size ID Size Name
0   1         24 Mantra Ancient Grains Foxtail Millet        1    500 gm
1   2          24 Mantra Ancient Grains Little Millet        2    500 gm
2   3                      24 Mantra Naturals Almonds        3    100 gm
3   4                       24 Mantra Naturals Kismis        4    100 gm
4   5                        24 Mantra Organic Ajwain        5    100 gm
5   6             24 Mantra Organic Apple Blast Drink        6    250 ml
6   7  24 Mantra Organic Apple Juice 1 Ltr Tetra Pack        7   1000 ml
7   8                   24 Mantra Organic Apple Juice        8    200 ml
8   9                     24 Mantra Organic Assam Tea        9    100 gm
0 голосов
/ 10 октября 2018

Предполагая, что вы хотите заменить значения имени размера на None, если они являются подстроками имени продукта

df = pd.DataFrame({
            'Product Name' : ['24 Mantra Ancient Grains Foxtail Millet 500 gm', '24 Mantra Ancient Grains Little Millet 500 gm ', '24 Mantra Naturals Kismis 100 gm'], 
            'Size ID' : [1, 2, 3],
            'Size Name': ['500 gm', '500 gm', '200 gm']
        })

df['same']= df.apply(lambda x: x['Size Name'] in x['Product Name'], axis = 1)
df['Size Name'] = np.where(df['same'], None, df['Size Name'])
df.drop(columns=['same'], inplace = True)
df

  Product Name                                Size ID      Size Name
0   24 Mantra Ancient Grains Foxtail Millet 500 gm  1              None
1   24 Mantra Ancient Grains Little Millet 500 gm   2              None
2   24 Mantra Naturals Kismis 100 gm                3              200 gm
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...