使用正则表达式映射的PANDAS新列在dict上与列表值匹配

时间:2017-03-08 14:53:32

标签: python regex pandas dictionary dataframe

想象一下,你有一个dicts列表,每个dict的值都是值列表。像这样。

foods = [ 
    {'apples' : ['sweet', 'round', 'red'] }, 
    {'liver' : ['juicy', 'flat', 'nasty'] }, 
    {'chocolate': ['tasty', 'block', 'dark' ] } 
]

现在想象一个带有一列名称的简单数据框,如下所示:

menu = [
    {'Name' : ['Sweet caramel bananas', 'Juicy farm salad', 'Hog face dark ice-cream destruction'] }
    {'Price' : [20, 15, 32] }
]
yum_yums = pandas.DataFrame(menu) 

假设您要为每个菜单项创建一个食物类别。例如,由于甜焦糖香蕉含有苹果,因此它应该将“苹果”键作为一个类别。

使用正则表达式将第一个列表中的dicts中的值与NAME列中的值相匹配,创建一个新的列,并将键作为指定的类别,最好的方法是什么?

最终结果如下:

menu = [
    {'Name' : ['Sweet caramel bananas', 'Juicy farm salad', 'Hog face dark ice-cream destruction'] }
    {'Price' : [20, 10, 32] }
    {'Category' : ['apple', 'liver', 'chocolate'] }
]
food_w_cat = pandas.DataFrame(menu)

1 个答案:

答案 0 :(得分:0)

您可以简单地遍历菜单和类别,而不是使用正则表达式,例如:

category = []
#iterate through menu names
for i_name in menu[0]['Name']:

    #transform menu name to lowercase for comparison
    i_name_lower = [i.lower() for i in i_name.split(' ')]

    #enable multiple categories of food per menu
    food_category = []

    #iterate through food categories
    for i_foods in foods:       

        key = list(i_foods.keys())[0]   

        if any([j in i_name_lower for j in i_foods[key]]):
            food_category.append(key)

    category.append(food_category)

menu.append({'category':category})

输出如下:

[{'Name': ['Sweet caramel bananas',
   'Juicy farm salad',
   'Hog face dark ice-cream destruction']},
 {'Price': [20, 15, 32]},
 {'category': [['apples'], ['liver'], ['chocolate']]}]