2016-12-09 8 views
1

私はアフィリエーションマトリックスに似たDataFrameを持っています。私は人、イベント、イベントの年を持っています。投影されたグラフのエッジに属性を追加する

d = {'person' : ['1', '2', '3', '1', '4', '3', '4', '1', '2'], 
    'event' : ['A', 'A', 'A', 'B', 'B', 'C', 'C', 'D', 'D'], 
    'year' : [1995, 1995, 1995, 1996, 1996, 2000, 2000, 2001, 2001]} 

df = pd.DataFrame(d) 

私は2人の間で最初のミーティングをする必要があります。つまり、イベント「A」と「D」で「1」と「2」が出会ったとき、初めて会ったときを知る必要があります(この例では、1995年に「A」でした)。

私はこれがNetworkXを使用して可能かどうか、またはPandasを使用して別の方法で行う必要があるかどうかわかりません。これどうやってするの?

私は投影されたネットワークに行くことができますが、投影されたネットワークの端に属性 '年'をどのように転送するのか分かりません。属性(この場合は「年」)はイベントの属性であるため、各イベントのすべてのエッジで一定であることに注意することが重要です。

import networkx as nx 
import pandas as pd 

d = {'person' : ['1', '2', '3', '1', '4', '3', '4', '1', '2'], 
    'event' : ['A', 'A', 'A', 'B', 'B', 'C', 'C', 'D', 'D'], 
    'year' : [1995, 1995, 1995, 1996, 1996, 2000, 2000, 2001, 2001]} 

df = pd.DataFrame(d) 

B = nx.from_pandas_dataframe(df, 'person', 'event', edge_attr='year') 

G = nx.bipartite.projected_graph(B, df.person.unique(), multigraph = True) 
+0

元の回答の誤りを修正しました。私は間違った場所でソートしましたが、今は良いはずです。これがあなたのユースケースに合わないのかどうか教えてください。 – 3novak

+0

@ 3novakありがとう!それはうまくいく。私はこれが大規模なデータセットでどのように実行されるのだろうかと思います。私は反復の代わりにマージを行う方法を作りました。たぶん私はあなたの答えで解決できるように質問を言い換えることができます。おそらく、インポートする必要があるライブラリを追加することができます。 – frmo

+0

良い点、@frmo。 itertoolsライブラリのimport文を追加しました。あなたのマージソリューションを共有できますか?私はそれがどのように機能するのか興味があります。あなたが提案した方法で解決できるように質問を言い換えることの意味を説明できますか? – 3novak

答えて

0

私はエッジを追加する属性の問題のお手伝いをするのに十分なNetworkXに慣れていないんだけど、この方法は、個人の最初の会議を識別します:

は、これは私がこれまで持っているものです。

import pandas as pd 
import itertools 

# initial data 
d = {'person' : ['1', '2', '3', '1', '4', '3', '4', '1', '2'], 
    'event' : ['A', 'A', 'A', 'B', 'B', 'C', 'C', 'D', 'D'], 
    'year' : [1995, 1995, 1995, 1996, 1996, 2000, 2000, 2001, 2001]} 

df = pd.DataFrame(d) 

# create a unique list of individuals for each meeting. this should be 
# unique anyway, but just in case. :) 
# note that this approach is also robust to events in different years 
# sharing the same name. 

grpd = df.groupby(['year', 'event'])['person'].unique().apply(lambda x: sorted(x)) 

# sort based on the year from the oldest meetings to the most recent 
grpd.sort_index(ascending=False, inplace=True) 

# we'll add meetings to a dictionary and overwrite as encounter more 
# recent meetings 

meetings = {} 

for idx in range(len(grpd)): 
    year = grpd.index[idx][0] 
    meeting = grpd.index[idx][1] 
    for combo in itertools.combinations(grpd[idx], 2): 
     meetings[combo] = (meeting, year) 


import pprint 

>>> pprint.pprint(meetings) 
{('1', '2'): ('A', 1995), 
('1', '3'): ('A', 1995), 
('1', '4'): ('B', 1996), 
('2', '3'): ('A', 1995), 
('3', '4'): ('C', 2000) 
関連する問題