首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python/Pandas -用另一个dataframe的值替换一个dataframe中的元素

Python/Pandas -用另一个dataframe的值替换一个dataframe中的元素
EN

Stack Overflow用户
提问于 2016-07-14 09:59:51
回答 1查看 1.4K关注 0票数 3

我对用来自另一只熊猫DataFrame的DataFrame值替换一个元素有一个问题。为这个长邮差道歉。我试图举出许多中间的例子来澄清我的问题。我使用Python2.7.11 (Anaconda 4.0.0,64位)。

数据

我有一个熊猫DataFrame包含许多用户项目对。这个DataFrame (我们称之为initial_user_item_matrix)的形式如下:

代码语言:javascript
复制
   userId itemId  interaction
1       1      1            1
2       1      2            0
3       1      3            1
4       1      4            1
5       2      9            1
6       3      3            1
7       3      5            0

此外,我有一个只包含用户1的用户项对的DataFrame。我称之为cold_user_item_matrix,这个DataFrame的形式是:

代码语言:javascript
复制
   userId itemId  interaction
1       1      1            1
2       1      2            0
3       1      3            1
4       1      4            1

接下来,我有一个带有项目的numpy ndarray,我称之为ranked_items。它的形式如下:

代码语言:javascript
复制
[9 5 3 4]

最后,我将initial_user_item_matrix中的用户1的交互更改为NaN,这给出了以下DataFrame (称为new_user_item_matrix):

代码语言:javascript
复制
   userId itemId  interaction
1       1      1          NaN
2       1      2          NaN
3       1      3          NaN
4       1      4          NaN
5       2      9            1
6       3      3            1
7       3      5            0

我想实现什么?

我希望将new_user_item_matrix中的用户1-项对的交互(当前为NaN)更改为initial_user_item_matrix 中特定交互的值,当且仅当该项包含在ranked_items数组中。之后,应该删除交互仍然是NaN的所有用户项对( itemId不在ranked_items中的用户1-项对)。请参见下面的结果集应该是什么样的。

中间结果:

代码语言:javascript
复制
   userId itemId  interaction
1       1      1          NaN
2       1      2          NaN
3       1      3            1
4       1      4            1
5       2      9            1
6       3      3            1
7       3      5            0

最终结果:

代码语言:javascript
复制
   userId itemId  interaction
3       1      3            1
4       1      4            1
5       2      9            1
6       3      3            1
7       3      5            0

我试过什么?

这是我的密码:

代码语言:javascript
复制
for item in ranked_items:
    if new_user_item_matrix.loc[new_user_item_matrix['userId']==cold_user].loc[new_user_item_matrix['itemId']==item].empty:
        pass
    else: new_user_item_matrix.replace(to_replace=new_user_item_matrix.loc[new_user_item_matrix['userId']==1].loc[new_user_item_matrix['itemId']==item].iloc[0,2],value=cold_user_item_matrixloc[cold_user_item_matrix['itemId']==item].iloc[0,2],inplace=True)

new_user_item_matrix.dropna(axis=0,how='any',inplace=True)

是干什么的呢?它循环遍历ranked_items数组中的所有项。首先,它检查用户1是否与项( if -if语句的一部分)交互。如果没有,则转到ranked_items数组中的下一个项(pass)。如果用户1确实与项( If语句的另一部分)交互,则将用户1的交互替换为来自new_user_item_matrix (当前为NaN)的项,将用户1的交互值替换为用户1与来自cold_user_item_matrix的项的交互值,后者为1或0(我希望你们都还在我身边)。

出什么问题了?

if语句的if-部分不会出现任何问题。当我试图替换new_user_item_matrix ( if语句的其他部分)的值时,它就出错了。在替换特定元素(交互)时,它不仅会替换该元素,而且还会将中的所有其他值替换为new_user_item_matrix中的NaN。为了说明,如果循环开始,它首先在itemId的9和5上循环,用户1没有与它们交互(因此什么都没有发生)。接下来,它在itemId 3上循环,userId 1和itemId 3的交互应该从NaN变为0。但是,它不仅将userId 1和itemId 3的交互更改为0,而且还将用户1的所有其他交互都更改为NaN的交互。

代码语言:javascript
复制
   userId itemId  interaction
1       1      1            1
2       1      2            1
3       1      3            1
4       1      4            1
5       2      9            1
6       3      3            1
7       3      5            0

这显然是不正确的,因为itemId 1和2不在ranked_items数组中,因此不应该发现它们之间的真正交互。此外,用户1和itemId 3的交互(a 1)对于所有交互都是填充的(即使它们的交互不是1,而是0)。

有谁能帮我吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-14 12:21:06

短解

本质上,您希望丢弃给定用户的所有项交互,但只对未排序的项丢弃。

为了使建议的解决方案更具可读性,请假定为df = initial_user_item_matrix

带有布尔条件的简单行选择(在原始df上生成只读视图):

代码语言:javascript
复制
filtered_df = df[(df.userID != 1) | df.itemID.isin(ranked_items)]

类似的解决方案通过删除“无效”行来就地修改dataframe:

代码语言:javascript
复制
df.drop(df[(df.userID == 1) & ~df.itemID.isin(ranked_items)].index, inplace=True)

一步一步地使用所有中间结构

假设需要上述所有中间工件,则可以按以下方式获得所需的结果:

代码语言:javascript
复制
import pandas as pd
import numpy as np

initial_user_item_matrix = pd.DataFrame([[1, 1, 1], 
                                        [1, 2, 0], 
                                        [1, 3, 1], 
                                        [1, 4, 1], 
                                        [2, 9, 1], 
                                        [3, 3, 1], 
                                        [3, 5, 0]],
                                        columns=['userID', 'itemID', 'interaction'])
print("initial_user_item_matrix\n{}\n".format(initial_user_item_matrix))

ranked_items = np.array([9, 5, 3, 4]) 

cold_user = 1 

cold_user_item_matrix = initial_user_item_matrix.loc[initial_user_item_matrix.userID == cold_user]
print("cold_user_item_matrix\n{}\n".format(cold_user_item_matrix))

new_user_item_matrix = initial_user_item_matrix.copy()
new_user_item_matrix.ix[new_user_item_matrix.userID == cold_user, 'interaction'] = np.NaN
print("new_user_item_matrix\n{}\n".format(new_user_item_matrix))

new_user_item_matrix.ix[new_user_item_matrix.userID == cold_user, 'interaction'] = cold_user_item_matrix.apply(lambda r: r.interaction if r.itemID in ranked_items else np.NaN, axis=1)
print("new_user_item_matrix after replacing\n{}\n".format(new_user_item_matrix))

new_user_item_matrix.dropna(inplace=True)
print("new_user_item_matrix after dropping nans\n{}\n".format(new_user_item_matrix))

产生

代码语言:javascript
复制
initial_user_item_matrix
   userID  itemID  interaction
0       1       1            1
1       1       2            0
2       1       3            1
3       1       4            1
4       2       9            1
5       3       3            1
6       3       5            0

cold_user_item_matrix
   userID  itemID  interaction
0       1       1            1
1       1       2            0
2       1       3            1
3       1       4            1

new_user_item_matrix
   userID  itemID  interaction
0       1       1          NaN
1       1       2          NaN
2       1       3          NaN
3       1       4          NaN
4       2       9            1
5       3       3            1
6       3       5            0

new_user_item_matrix after replacing
   userID  itemID  interaction
0       1       1          NaN
1       1       2          NaN
2       1       3            1
3       1       4            1
4       2       9            1
5       3       3            1
6       3       5            0

new_user_item_matrix after dropping nans
   userID  itemID  interaction
2       1       3            1
3       1       4            1
4       2       9            1
5       3       3            1
6       3       5            0
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38371181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档