遍历多个列表后,根据其他列值创建新列

时间:2018-10-03 20:27:12

标签: python list loops dataframe

我有一个数据框,其中包含一列包含多种食品的列。我想用食品类型创建一个新列,该列存储在多个列表中。

这是我的列表:

fruits = ['apples', 'oranges', 'bananas']
veggies = ['carrots', 'lettuce', 'onions']
meats = ['steak', 'chicken', 'fish']

我有一个包含所有这些食物的列,但不想创建一个包含食物类型的列。

我有一个笨拙的解决方案,但是我想知道是否有一种更简单的方法来遍历这些列表并将食物类型附加到新列中。

这是我当前的解决方案:

df['food_type'] = np.where(df['foods'].isin(fruits),'fruits',
                        (np.where(df['foods'].isin(veggies),'veggies',                            
                        (np.where(df['foods'].isin(meats),'meats','other')))))

创建包含列表的字典并对其进行遍历会更好吗?即

food_types ={'fruits':['apples','oranges','bananas'],'veggies':['carrots', 'lettuce', 'onions'],'meats': ['steak', 'chicken', 'fish']}

1 个答案:

答案 0 :(得分:0)

我只是按照您在OP中的建议,将您的数据放入字典中:

import pandas as pd

fruits = ['apples', 'oranges', 'bananas']
veggies = ['carrots', 'lettuce', 'onions']
meats = ['steak', 'chicken', 'fish']

data = {'fruits': fruits, 'veggies': veggies, 'meats': meats}

df = pd.DataFrame(data)

收益:

    fruits  veggies    meats
0   apples  carrots    steak
1  oranges  lettuce  chicken
2  bananas   onions     fish

根据您的评论,如果列表的长度不同,这将不起作用。使用原始数据帧格式,可以对apply()执行以下操作:

df = pd.DataFrame(fruits + veggies + meats, columns=['foods'])

def find_category(x):

  return [k for k, v in data.items() if x in v][0]

df['food_type'] = df['foods'].apply(find_category)

收益:

     foods food_type
0   apples    fruits
1  oranges    fruits
2  bananas    fruits
3  carrots   veggies
4  lettuce   veggies
5   onions   veggies
6    steak     meats
7  chicken     meats
8     fish     meats