通过熊猫数据框/系列的特定列进行迭代

时间:2019-06-07 19:33:24

标签: python pandas countvectorizer

我正在实施一份研究论文,其中我必须根据其成分对美食进行分类。提供成分培训数据集和测试数据集。一切正常。根据SGD,RandomForest和Naive Bayes之间的准确性,使用最佳方法对模型进行了训练。我使用随机森林是因为它的准确性比NB和SGD都要好。测试数据集已经过测试,预测工作正常。现在,我想通过手动输入成分(使用python的input())来预测美食。当我尝试在此处Y = train_data['all_ingredients'] OR Y = train_data['ingredients']命名的熊猫系列/数据框中搜索时,问题就来了。


def check_ing(ing):
    if ing in train_data['all_ingredients'].values:
        return True
    return False


no_of_ingredients = input("Total Number Of Ingredients: ")
no_of_ingredients = int(no_of_ingredients)
ingredient = []
for i in range(no_of_ingredients):
    ing = input("Enter Ingredient " + str(i) + " : ")
    if check_ing(ing) is True:
        ingredient.append(ing)

print(ingredient)

问题出在函数check_ing(ing)的if语句中。 如何改善搜索用户输入的成分是否有效的方法。

Y.head()的结果是: enter image description here

2 个答案:

答案 0 :(得分:1)

我认为这回答了您的问题,如果输入不在列成分中,它将是无效的,您可能必须更改if的第一部分

编辑:没有测试,这应该工作。 编辑2:搞砸了复制和粘贴。

all_ing = [item for sublist in train_data["Ingredients"] for item in sublist]

def check_ing(ing):
    if ing in all_ing:
            return True
    else:
        print("invalid ingredient")
        return False 

no_of_ingredients = input("Total Number Of Ingredients: ")
no_of_ingredients = int(no_of_ingredients)
ingredient = []

for i in range(no_of_ingredients):
    ing = input("Enter Ingredient " + str(i) + " : ")
    tf = check_ing(ing)
    if tf is True:
        ingredient.append(ing)

print(ingredient)

答案 1 :(得分:1)

不是一个完整的答案,但是您可以改善的一件事是使用set而不是Series

valid_ing = set(train_data['Ingredients'])

def check_ing(ing):
    return  ing in valid_ing

测试样本:

d = [''.join(np.random.choice(list('abcdefghijklmn'), 10, replace=True)) for _ in range(1000)]
s = pd.Series(d)

%%timeit
'abc' in s
# 4.3 µs ± 365 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

valid_ing  = set(s)
%%timeit
'abc' in valid_ing 
# 155 ns ± 15.7 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)