2016-04-03 3 views
0

Iは、2つのデータフレームを持って、一つは、ユーザ項目の評価であり、他方は、アイテムのサイド情報である。python-pandasで2つのデータフレームを因数分解する方法はありますか?

#df1 
A12VH45Q3H5R5I B000NWJTKW 5.0 
A3J8AQWNNI3WSN B000NWJTKW 4.0 
A1XOBWIL4MILVM BDASK99000 1.0 

#df2 
B000NWJTKW .... 
BDASK99000 .... 

今はIDを整数にアイテムとユーザの名前をマップしたいw'd。

df.apply(lambda x: pd.factorize(x)[0] + 1) 

しかし、私は二つのデータフレーム内の項目の整数が一貫していることを確認したいとD」:私はそこfactorizeの方法があることを知っています。したがって、結果のデータフレームは次のようになります。

#df1 
1  1  5.0 
2  1  4.0 
3  2  1.0 

#df2 
1  ... 
2  ... 

これを確認する方法は知っていますか?前もって感謝します!

答えて

2

連結し、共通のカラム(複数可)、及びpd.factorize(又はpd.Categorical)を適用することで:例えば

codes, uniques = pd.factorize(pd.concat([df1['item'], df2['item']])) 
df1['item'] = codes[:len(df1)] + 1 
df2['item'] = codes[len(df1):] + 1 

import pandas as pd 

df1 = pd.DataFrame(
[('A12VH45Q3H5R5I', 'B000NWJTKW', 5.0), 
('A3J8AQWNNI3WSN', 'B000NWJTKW', 4.0), 
('A1XOBWIL4MILVM', 'BDASK99000', 1.0)], columns=['user', 'item', 'rating']) 

df2 = pd.DataFrame(
[('B000NWJTKW', 10), 
('BDASK99000', 20)], columns=['item', 'extra']) 

codes, uniques = pd.factorize(pd.concat([df1['item'], df2['item']])) 
df1['item'] = codes[:len(df1)] + 1 
df2['item'] = codes[len(df1):] + 1 

codes, uniques = pd.factorize(df1['user']) 
df1['user'] = codes + 1 

print(df1) 
print(df2) 

収率

# df1 
    user item rating 
0  1  1  5 
1  2  1  4 
2  3  2  1 

# df2 
    item extra 
0  1  10 
1  2  20 

もう一つdf3 = pd.merge(df1, df2, on='item', how='outer')、その後、df3['item']を因数分解::回避策する問題(あなたが十分なメモリを持っている場合)の方法は、二つのデータフレームをマージするだろう

df3 = pd.merge(df1, df2, on='item', how='outer') 
for col in ['item', 'user']: 
    df3[col] = pd.factorize(df3[col])[0] + 1 
print(df3) 

利回り

user item rating extra 
0  1  1  5  10 
1  2  1  4  10 
2  3  2  1  20 
関連する問題