簡體   English   中英

Python / Pandas-用另一個數據框中的值替換一個數據框中的元素

[英]Python/Pandas - Replacing an element in one dataframe with a value from another dataframe

我有一個問題,一個熊貓數據框架中的元素被另一個熊貓數據框架中的值替換。 很長的道歉。 我試圖給出許多例子來闡明我的問題。 我使用Python 2.7.11(Anaconda 4.0.0,64位)。

數據

我有一個包含許多用戶項對的pandas DataFrame。 此DataFrame(我們稱它為initial_user_item_matrix )具有以下形式:

   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的形式為:

   userId itemId  interaction
1       1      1            1
2       1      2            0
3       1      3            1
4       1      4            1

接下來,我有一個帶有項的numpy ndarray,我稱之為rank_items 它的形式為:

[9 5 3 4]

最后,我將initial_user_item_matrix中用戶1的交互更改為NaN ,從而提供以下DataFrame(將其稱為new_user_item_matrix ):

   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中特定交互的值IF並且僅該項包含在rank_items數組中時。 之后,應刪除所有交互仍然為NaN用戶項對(DataFrame的行)(用戶1-itemId不在rank_items中的項對)。 參見下面的結果集應該是什么樣子。

結果之間:

   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

最后結果:

   userId itemId  interaction
3       1      3            1
4       1      4            1
5       2      9            1
6       3      3            1
7       3      5            0

我嘗試了什么?

這是我的代碼:

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)

它有什么作用? 它循環遍歷rank_items數組中的所有項目。 首先,它檢查用戶1是否已與項目(if語句的if部分)進行了交互。 如果不是,則轉到rank_items數組中的下一項(通過)。 如果用戶1與項目交互(if語句的else部分),則將用戶1與new_user_item_matrix (當前為NaN )中的項目交互替換為用戶1與項目1中的項目交互的值。 cold_user_item_matrix ,可以是1或0(我希望你們都還和我在一起)。

怎么了?

if語句的if部分不會出現任何問題。 當我嘗試替換new_user_item_matrix (if語句的else部分)中的值時,這是錯誤的。 替換特定元素(交互)時,它不僅會替換該元素,還會替換new_user_item_matrix中 所有其他NaN值。 為了說明這一點,如果循環開始,它將首先在itemId的9和5上循環,用戶1尚未與之交互(因此什么也沒有發生)。 接下來,它遍歷itemId 3,並且userId 1和itemId 3的交互應從NaN更改為0。但是,它不僅將userId 1和itemId 3的交互更改為0,而且還將用戶1的所有其他交互更改為是NaN 給出以下結果集:

   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不在rank_items數組中,因此不應發現它們的真實交互。 同樣,用戶1和itemId 3的交互(a 1)被填寫用於所有交互(即使它們的交互不是1而是0)。

有人可以幫助我嗎?

短期解決方案

本質上,您希望放棄給定用戶的所有項目交互,而只丟棄那些排名的項目。

為了使所提出的解決方案更具可讀性,假定df = initial_user_item_matrix

具有布爾條件的簡單行選擇(在原始df上生成一個只讀視圖):

filtered_df = df[(df.userID != 1) | df.itemID.isin(ranked_items)]

類似的解決方案是通過刪除“無效”行來就地修改數據框:

df.drop(df[(df.userID == 1) & ~df.itemID.isin(ranked_items)].index, inplace=True)

使用所有中間結構的逐步解決方案

假設需要上述所有中間工件,則可以按以下方式獲得所需結果:

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))

產生

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM