gpt4 book ai didi

python - 在遍历列表时在数据框的一行中添加多个值

转载 作者:行者123 更新时间:2023-12-04 02:35:52 27 4
gpt4 key购买 nike

我正在构建一个食物推荐系统并且我有一个数据框:

df:
meat vegetables cheese ketchup egg...
hamburger 3 5 2 2 1
pasta 0 0 4 0 1
soup 0 2 0 0 0
...

我还有一个列表,其中包含用户不喜欢的成分:

dislike:["cheese", "egg"]  

所以我想做的是创建一个函数,添加一个新行“user_name”,在他/她不喜欢的那些成分中有 10,在所有其他列中有 0。输出应该是:

            meat vegetables cheese ketchup egg...
hamburger 3 5 2 2 1
pasta 0 0 4 0 1
soup 0 2 0 0 0
new_user 0 0 10 0 10
...

我简化了数据框和列表以使其更全面,但实际上它们更长。

这是我到现在为止写的:

def user_pre(df):
dislike=["cheese","egg"]
for ing in dislike:
df.loc["new_user"]= pd.Series({ing:10})
return df

我“工作”但只针对不喜欢列表中的最后一个元素。此外,它不会在其他单元格中添加一个 0,而是添加一个 Nan。

提前致谢!

最佳答案

我不确定将用户与菜肴混合在单个 pandas DataFrame 中有多“健康”,但像这样的函数应该可以完成工作:

def insert_user_dislikes(user_name='new_user', df=df, ingredients=['meat', 'egg']):
df.loc[user_name] = [10 if col in ingredients else 0 for col in df.columns]

insert_user_dislikes('new_user', df, ['meat', 'egg'])

编辑 1:我也喜欢@Fred 的解决方案:

def insert_user_dislikes2(user_name='new_user', df=df, ingredients=['meat', 'egg']):
df.loc[user_name] = 0
df.loc[user_name, ingredients] = 10
insert_user_dislikes('user_name', df, ['meat', 'egg'])

编辑 2:这是 Shubham 的绩效评估解决方案:

def insert_user_dislikes3(user_name='new_user', df=df, ingredients=['meat', 'egg']):
s = pd.Series(
np.where(df.columns.isin(ingredients), 10, 0),
name=user_name, index=df.columns, dtype='int')
return df.append(s)

就性能而言(在非常小的数据集上),看起来列表理解速度更快:

df = pd.DataFrame([[3, 5, 2, 2, 1],
[0, 0, 4, 0, 1]],
columns=['meat', 'vegetables', 'cheese','ketchup', 'egg'],
index=['hamburger', 'pasta'])

print(timeit.timeit(insert_user_dislikes, number=1000))
0.125

print(timeit.timeit(insert_user_dislikes2, number=1000))
0.547

print(timeit.timeit(insert_user_dislikes3, number=1000))
2.153

关于python - 在遍历列表时在数据框的一行中添加多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61893741/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com