遍历 pandas Dataframe/Series 的特定列
Iterate thorugh a particular column of pandas Dataframe/Series
我正在执行一篇研究论文,其中我必须根据食材对菜肴进行分类。提供了成分训练数据集和测试数据集。一切正常。根据 SGD、RandomForest 和朴素贝叶斯之间的准确性,使用最佳方法对模型进行了训练。我正在使用随机森林,因为它的准确性优于 NB 和 SGD。测试数据集已经过测试,预测工作绝对正常。现在我想通过手动输入(使用 python 的 input()
)成分来预测美食。当我尝试在此处命名为 Y = train_data['all_ingredients'] OR Y = train_data['ingredients']
的 pandas 中搜索 series/Dataframe 时,问题就来了。
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()
的结果是:
我认为这回答了您的问题,如果输入不在成分列中,它将无效,您可能需要更改 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)
不是一个完整的答案,但您可以改进的一件事是使用 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)
我正在执行一篇研究论文,其中我必须根据食材对菜肴进行分类。提供了成分训练数据集和测试数据集。一切正常。根据 SGD、RandomForest 和朴素贝叶斯之间的准确性,使用最佳方法对模型进行了训练。我正在使用随机森林,因为它的准确性优于 NB 和 SGD。测试数据集已经过测试,预测工作绝对正常。现在我想通过手动输入(使用 python 的 input()
)成分来预测美食。当我尝试在此处命名为 Y = train_data['all_ingredients'] OR Y = train_data['ingredients']
的 pandas 中搜索 series/Dataframe 时,问题就来了。
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()
的结果是:
我认为这回答了您的问题,如果输入不在成分列中,它将无效,您可能需要更改 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)
不是一个完整的答案,但您可以改进的一件事是使用 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)