Как записать поверх столбца в pandas на основе значения, найденного в другом соответствующем столбце? - PullRequest
0 голосов
/ 19 июня 2020

Я хочу записать значение в столбце категории как предварительно заданное значение в списке. Заголовок моего DataFrame выглядит следующим образом:

                       Product Category
0           Macbook Pro Laptop        -
1           LG Washing Machine        -
2         USB-C Charging Cable        -
3             27in FHD Monitor        -
4         USB-C Charging Cable        -
5        AA Batteries (4-pack)        -
6         USB-C Charging Cable        -
7         USB-C Charging Cable        -
8   Bose SoundSport Headphones        -
9       AAA Batteries (4-pack)        -
10        USB-C Charging Cable        -
11             ThinkPad Laptop        -
12       AA Batteries (4-pack)        -
13      AAA Batteries (4-pack)        -
14        USB-C Charging Cable        -

Я хочу заменить столбец «Категория» предварительно заданными значениями в списках, которые выглядят следующим образом:

con_elec = ['20in Monitor', 
         '27in 4K Gaming Monitor', 
         '27in FHD Monitor', 
         '34in Ultrawide Monitor', 
         'Flatscreen TV', 
         'Google Phone', 
         'Macbook Pro Laptop', 
         'ThinkPad Laptop', 
         'Vareebadd Phone', 
         'iPhone']
elec_acc = ['AA Batteries (4-pack)',
            'AAA Batteries (4-pack)', 
            'Apple Airpods Headphones',
            'Bose SoundSport Headphones',
            'Lightning Charging Cable',
            'USB-C Charging Cable',
            'Wired Headphones']
house_app = ['LG Dryer',
             'LG Washing Machine']

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

Я пробовал использовать следующий оператор if:

for product in df['Product']:
    if product in con_elec == True:
        df['Category'] = 'Consumer Electronics'
    elif product in elec_acc == True:
        df['Category'] = 'Electronic Accessories'
    elif product in house_app == True:
        df['Category'] = 'Household Appliances'

Этот код работает без ошибок, но не меняет значение в столбце «Категория» DataFrame. Как мне go получить фактическое изменение значений в столбце категории на нужную метку категории?

Ответы [ 2 ]

0 голосов
/ 19 июня 2020

Вы можете создать пользовательскую функцию и использовать для нее map с lambda. Также имейте в виду, когда вы используете in, == True является преувеличением, и вы можете избежать его использования:

def replacers(x):
    if x in con_elec:
        return 'Consumer Electronics'
    elif x in elec_acc:
        return 'Electronic Accessories'
    elif x in house_app:
        return 'Household Appliances'

А затем:

df['Category'] = df['Category'].map(lambda x: replacers(x))
0 голосов
/ 19 июня 2020

Вы можете использовать pandas.Series.map:

d = {}
for v, lst in [('Consumer Electronics', con_elec), ('Electronic Accessories', elec_acc), ('Household Appliances', house_app)]:
    for vv in lst:
        d[vv] = v

df['Category'] = df['Product'].map(d)

print(df)

Печать:

                       Product                Category
0           Macbook Pro Laptop    Consumer Electronics
1           LG Washing Machine    Household Appliances
2         USB-C Charging Cable  Electronic Accessories
3             27in FHD Monitor    Consumer Electronics
4         USB-C Charging Cable  Electronic Accessories
5        AA Batteries (4-pack)  Electronic Accessories
6         USB-C Charging Cable  Electronic Accessories
7         USB-C Charging Cable  Electronic Accessories
8   Bose SoundSport Headphones  Electronic Accessories
9       AAA Batteries (4-pack)  Electronic Accessories
10        USB-C Charging Cable  Electronic Accessories
11             ThinkPad Laptop    Consumer Electronics
12       AA Batteries (4-pack)  Electronic Accessories
13      AAA Batteries (4-pack)  Electronic Accessories
14        USB-C Charging Cable  Electronic Accessories
...