在数据帧的一行中添加多个值,同时通过列表进行迭代

2024-04-27 09:45:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在建立一个食品推荐系统,我有一个数据框架:

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

提前非常感谢


Tags: 数据框架df列表egg成分soupuser
3条回答

我不确定这种方法有多有效,但这应该行得通

dislikes = ["cheese","egg"]
new_user = "Tom"
df.loc[new_user] = 0
for dislike in dislikes:
    if dislike not in df.columns:
        df[dislike] = 0
    df.loc[new_user, dislike] = 10

我不确定在单个数据框中将用户与菜肴混合在一起有多“健康”,但这样的功能应该可以做到:

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

将new_user row=设置为零,然后过滤并等于10

print(df)
          meat  vegetables  cheese  ketchup  egg
hamburger     3           5       2        2    1
pasta         0           0       4        0    1
soup          0           2       0        0    0

将新用户创建为零

df.loc["new_user", :] = 0
print(df)
          meat  vegetables  cheese  ketchup  egg
hamburger   3.0         5.0     2.0      2.0  1.0
pasta       0.0         0.0     4.0      0.0  1.0
soup        0.0         2.0     0.0      0.0  0.0
new_user    0.0         0.0     0.0      0.0  0.0

然后再次过滤并设置为10

dislike = ["cheese", "egg"]

df.loc["new_user", dislike] = 10
print(df)
           meat  vegetables  cheese  ketchup   egg
hamburger   3.0         5.0     2.0      2.0   1.0
pasta       0.0         0.0     4.0      0.0   1.0
soup        0.0         2.0     0.0      0.0   0.0
new_user    0.0         0.0    10.0      0.0  10.0

相关问题 更多 >