2017-08-25 12 views
-1

私はデータフレームパンダ:マルコフ連鎖を使用してクラスタリングデータは

私はIDをクラスタリングする必要が
member_id domain 
111  vk.com 
111  facebook.com 
111  stackoverflow.com 
222  facebook.com 
222  twitter.com 
333  wikipedia.org 
333  vk.com 
333  facebook.com 

を持っていると私は、ドメインパスからマルコフ連鎖を取得する必要がありますが、私はいくつかの困難を持っています。

111: vk.com -> facebook.com -> stackoverflow.com 
222: facebook.com -> twitter.com 
333: wikipedia.org -> vk.com -> facebook.com 

すべてのIDに隣接行列を作成する必要がありますか?それをクラスタリングする方法は何ですか?それとも別の方法がありますか? または私はすべてのパスを取得し、すべてのIDと比較する必要がありますか?

答えて

1

あなたがした後、あなたのマルコフ連鎖で何かをしたいと思うと仮定それを集約すると、あなたは表現したいかもしれませんそれ免責事項Pythonのリストとして、例えば...

outer_list = [] 
for ID, sites in old_df.groupby("ID"): 
    inner_list = sites["domain"].values.tolist() 
    outer_list.append(inner_list) 

IDs = old_df.ID.unique() 
new_df = pd.DataFrame() 
new_df["member_id"] = pd.Series(IDs).values 
new_df["chain"] = pd.Series(outer_list).values 

あなたはこのようになりますデータフレームを持っているよ...

member_id chain 
0 1 [vk, fb, so] 
1 2 [fb, tw] 
2 3 [wik, vk, fb] 

:ない最速、最も神託のコード何とか何とか...

3
df.groupby('member_id')['domain'].agg(' -> '.join) 

は出力:

member_id 
111 vk.com -> facebook.com -> stackoverflow.com 
222     facebook.com -> twitter.com 
333  wikipedia.org -> vk.com -> facebook.com 
Name: domain, dtype: object 

またはリストとして:

df.groupby('member_id')['domain'].agg(lambda x: x.tolist()) 

出力:

member_id 
111 [vk.com, facebook.com, stackoverflow.com] 
222     [facebook.com, twitter.com] 
333  [wikipedia.org, vk.com, facebook.com] 
dtype: object 
関連する問題