【问题标题】:Iterate thorugh a particular column of pandas Dataframe/Series遍历熊猫数据框/系列的特定列
【发布时间】:2019-06-08 04:52:49
【问题描述】:

我正在实施一篇研究论文,其中我必须根据其成分对美食进行分类。提供配料训练数据集和测试数据集。一切正常。模型已根据 SGD、RandomForest 和朴素贝叶斯的准确性使用最佳方法进行训练。我正在使用随机森林,因为它的准确性优于 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() 的结果是:

【问题讨论】:

  • 我不知道你在问什么。关于训练方法有很多背景故事,但是当我们一开始并不真正了解问题时,您的问题似乎是“改进这一点”
  • 我只是添加了背景以确保。
  • 我很想编辑它 - 我认为这会分散注意力。但我无法收集问题的症结所在,所以我不想在没有你试图解决的明确问题的情况下留下它
  • 不同点是函数check_ing(ing) 中的 if 语句,如我所述。例如,如果用户输入garlic,我该如何改进以搜索整个train_data['ingredients']

标签: python pandas countvectorizer


【解决方案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)

【讨论】:

  • 它没有进入if statement 并且在有效成分上也没有给出无效成分。
【解决方案2】:

不是一个完整的答案,但您可以改进的一件事是使用 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)

【讨论】:

    猜你喜欢
    • 2021-11-09
    • 2019-05-09
    • 1970-01-01
    • 2017-06-08
    • 2023-01-10
    • 1970-01-01
    • 2020-06-03
    • 1970-01-01
    相关资源
    最近更新 更多