我正在嘗試解決此資料集的一個問題。鏈接在這里。所以,我以這種方式加載了資料集。
df = pd.read_csv('ratings.csv', sep='::', names=['user_id', 'movie_id', 'rating', 'timestamp'])
num_of_unique_users = len(df['user_id'].unique())
唯一用戶數為69878。如果我們列印出資料集的最后一行。我們可以看到用戶 id 在 69878 以上。在這種情況下缺少用戶 id。電影ID的情況相同。電影 ID 數量超過實際 ID。
我只希望它將丟失的 user_id 與現有的匹配并且不超過 69878。例如,數字75167將成為唯一用戶 ID 的最后一個數字,即69878,電影 ID 65133將成為10677最后一個唯一的電影 ID .
實際的
user_id movie_id rating timestamp
0 1 122 5.0 838985046
1 1 185 5.0 838983525
2 1 231 5.0 838983392
3 1 292 5.0 838983421
4 1 316 5.0 838983392
... ... ... ... ...
10000044 71567 1984 1.0 912580553
10000045 71567 1985 1.0 912580553
10000046 71567 1986 1.0 912580553
10000047 71567 2012 3.0 912580722
10000048 71567 2028 5.0 912580344
期望的
user_id movie_id rating timestamp
0 1 122 5.0 838985046
1 1 185 5.0 838983525
2 1 231 5.0 838983392
3 1 292 5.0 838983421
4 1 316 5.0 838983392
... ... ... ... ...
10000044 69878 1984 1.0 912580553
10000045 69878 1985 1.0 912580553
10000046 69878 1986 1.0 912580553
10000047 69878 2012 3.0 912580722
10000048 69878 2028 5.0 912580344
有沒有辦法用熊貓做這個?
uj5u.com熱心網友回復:
這是一種方法:
df2 = df.groupby('user_id').count().reset_index()
df2 = df2.assign(new_user_id=df2.index 1).set_index('user_id')
df = df.join(df2['new_user_id'], on='user_id').drop(columns=['user_id']).rename(columns={'new_user_id':'user_id'})
df2 = df.groupby('movie_id').count().reset_index()
df2 = df2.assign(new_movie_id=df2.index 1).set_index('movie_id')
df = df.join(df2['new_movie_id'], on='movie_id').drop(columns=['movie_id']).rename(columns={'new_movie_id':'movie_id'})
df = pd.concat([df[['user_id', 'movie_id']], df.drop(columns=['user_id', 'movie_id'])], axis=1)
樣本輸入:
user_id movie_id rating timestamp
0 1 2 5.0 838985046
1 1 4 5.0 838983525
2 3 4 5.0 838983392
3 3 6 5.0 912580553
4 5 2 5.0 912580722
5 5 6 5.0 912580344
樣本輸出:
user_id movie_id rating timestamp
0 1 1 5.0 838985046
1 1 2 5.0 838983525
2 2 2 5.0 838983392
3 2 3 5.0 912580553
4 3 1 5.0 912580722
5 3 3 5.0 912580344
這是中間結果和解釋。
首先我們這樣做:
df2 = df.groupby('user_id').count().reset_index()
輸出:
user_id movie_id rating timestamp
0 1 2 2 2
1 3 2 2 2
2 5 2 2 2
我們上面所做的是使用groupby每個唯一 user_id 獲取一行。我們呼叫count只是為了將輸出(一個 groupby 物件)轉換回一個資料幀。我們呼叫reset_index創建一個沒有間隙的新整數范圍索引。(注意:我們關心以供將來使用的唯一列是 user_id。)
接下來我們這樣做:
df2 = df2.assign(new_user_id=df2.index 1).set_index('user_id')
輸出:
movie_id rating timestamp new_user_id
user_id
1 2 2 2 1
3 2 2 2 2
5 2 2 2 3
該assign呼叫創建了一個名為 new_user_id 的新列,我們使用 0 偏移索引加 1 填充該列(這樣我們的 id 值不會小于 1)。該set_index呼叫將我們的索引替換user_id為預期使用此資料幀的索引作為延遲呼叫的目標join。
下一步是:
df = df.join(df2['new_user_id'], on='user_id').drop(columns=['user_id']).rename(columns={'new_user_id':'user_id'})
輸出:
movie_id rating timestamp user_id
0 2 5.0 838985046 1
1 4 5.0 838983525 1
2 4 5.0 838983392 2
3 6 5.0 912580553 2
4 2 5.0 912580722 3
5 6 5.0 912580344 3
這里我們只取了 df2 的 new_user_id 列并呼叫join了 df 物件,指示方法使用 df 中的 user_id 列(on引數)與索引(最初是 df2 中的 user_id 列)連接。這將在名為 new_user_id 的列中創建一個具有所需新范式 user_id 值的 df。剩下的就是洗掉舊范式 user_id 列并將 new_user_id 重命名為 user_id,這就是呼叫drop和rename執行的操作。
將movie_id 值更改為新范例的邏輯(即消除唯一值集中的間隙)是完全類似的。完成后,我們有以下輸出:
rating timestamp user_id movie_id
0 5.0 838985046 1 1
1 5.0 838983525 1 2
2 5.0 838983392 2 2
3 5.0 912580553 2 3
4 5.0 912580722 3 1
5 5.0 912580344 3 3
最后,我們使用以下代碼對列進行重新排序,使其看起來與原始列相同:
df = pd.concat([df[['user_id', 'movie_id']], df.drop(columns=['user_id', 'movie_id'])], axis=1)
輸出:
user_id movie_id rating timestamp
0 1 1 5.0 838985046
1 1 2 5.0 838983525
2 2 2 5.0 838983392
3 2 3 5.0 912580553
4 3 1 5.0 912580722
5 3 3 5.0 912580344
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/474779.html
上一篇:根據特定元素拆分串列
