Сравнение фрейма данных со списком и обновление фрейма данных на основе сравнения данных списка - PullRequest
0 голосов
/ 17 марта 2020

Я пытаюсь сравнить текст в столбце данных с существующим списком, а затем обновить новый столбец в кадре данных на основе сравнения. Текст в столбце dataframe является более сложным, чем в списке. Если текст фрейма данных содержит текст из списка, я бы хотел взять значение списка и обновить новый столбец фрейма данных. Я попытался for-l oop для этого, но я получаю ошибку, что мой итератор не является целым числом. Ниже приведены определения и мой код.

myDF - это фрейм данных. Продукт - это столбец, который я бы хотел оценить. Makelist - это список строк, с которыми я бы хотел сравнить myDF.Product. Если есть совпадение, я хочу обновить myDF.Brand.

Когда я запускаю следующее, я получаю ошибку, которая говорит, что я индексирую с недопустимым типом переменной.

import pandas as pd
myDF = pd.DataFrame({"Location": 'S1 S1 S1 S1 S1'.split(),
                    "Product": '12AB 34CD 56EF 78GH 90IJ'. split(),
                    "Brand": ""})
makelist = ['12A', '4CD', '56', '78G', '90IJ']

for items in myDF.Product:
    for makes in makelist:
        if makelist[makes] in(myDF.Product.iloc[items]):
            myDF.Brand[items]=makelist[makes]

#expected output
Location Product Brand
0       S1    12AB   12A
1       S1    34CD   4CD
2       S1    56EF    56
3       S1    78GH   78G
4       S1    90IJ  90IJ

1 Ответ

0 голосов
/ 18 марта 2020

Здесь две реализации, первая следует вашей идее, вторая оптимизирует, используя только одну для l oop.

Настройка

import pandas as pd
brands = ['12A', '4CD', '56', '78G', '90IJ']

Два для циклов

myDF = pd.DataFrame({"Location": 'S1 S1 S1 S1 S1'.split(),
                    "Product": '12AB 34CD 56EF 78GH 90IJ'. split(),
                    "Brand": ""}) 

for product in myDF['Product']:
    for brand in brands:
        if brand in product:
            myDF.loc[myDF['Product']==product, 'Brand'] = brand

myDF
  Location Product Brand
0       S1    12AB   12A
1       S1    34CD   4CD
2       S1    56EF    56
3       S1    78GH   78G
4       S1    90IJ  90IJ

Один для l oop

myDF = pd.DataFrame({"Location": 'S1 S1 S1 S1 S1'.split(),
                    "Product": '12AB 34CD 56EF 78GH 90IJ'. split(),
                    "Brand": ""})     

for brand in brands:
    myDF.loc[myDF['Product'].str.contains(brand), 'Brand'] = brand

myDF
  Location Product Brand
0       S1    12AB   12A
1       S1    34CD   4CD
2       S1    56EF    56
3       S1    78GH   78G
4       S1    90IJ  90IJ
...