2016-02-04 5 views
5

नेटवर्क के from_pandas_dataframe का उपयोग कर एक पांडा डेटाफ्रेम से MultiGraph() उदाहरण बनाने का प्रयास कर रहा है। नीचे दिए गए उदाहरण में मैं क्या गलत कर रहा हूं?नेटवर्क x मल्टीग्राफ से_pandas_dataframe

In [1]: import pandas as pd 
     import networkx as nx 

     df = pd.DataFrame([['geneA', 'geneB', 0.05, 'method1'], 
          ['geneA', 'geneC', 0.45, 'method1'], 
          ['geneA', 'geneD', 0.35, 'method1'], 
          ['geneA', 'geneB', 0.45, 'method2']], 
          columns = ['gene1','gene2','conf','type']) 

डिफ़ॉल्ट nx.Graph() के साथ पहला प्रयास:

In [2]: G= nx.from_pandas_dataframe(df, 'gene1', 'gene2', edge_attr=['conf','type'], 
            create_using=nx.Graph()) 

एक गैर MultiGraph के रूप में(), मैं डुप्लिकेट किनारों में से एक याद कर रहा हूँ:

In [3]: G.edges(data=True) 
Out[3]: [('geneA', 'geneB', {'conf': 0.45, 'type': 'method2'}), 
     ('geneA', 'geneC', {'conf': 0.45, 'type': 'method1'}), 
     ('geneA', 'geneD', {'conf': 0.35, 'type': 'method1'})] 

MultiGraph():

In [4]: MG= nx.from_pandas_dataframe(df, 'gene1', 'gene2', edge_attr=['conf','type'], 
          create_using=nx.MultiGraph()) 

यह:

TypeError         Traceback (most recent call last) 
<ipython-input-49-d2c7b8312ea7> in <module>() 
----> 1 MG= nx.from_pandas_dataframe(df, 'gene1', 'gene2', ['conf','type'], create_using=nx.MultiGraph()) 

/usr/lib/python2.7/site-packages/networkx-1.10-py2.7.egg/networkx/convert_matrix.pyc in from_pandas_dataframe(df, source, target, edge_attr, create_using) 
    209   # Iteration on values returns the rows as Numpy arrays 
    210   for row in df.values: 
--> 211    g.add_edge(row[src_i], row[tar_i], {i:row[j] for i, j in edge_i}) 
    212 
    213  # If no column names are given, then just return the edges. 

/usr/lib/python2.7/site-packages/networkx-1.10-py2.7.egg/networkx/classes/multigraph.pyc in add_edge(self, u, v, key, attr_dict, **attr) 
    340    datadict.update(attr_dict) 
    341    keydict = self.edge_key_dict_factory() 
--> 342    keydict[key] = datadict 
    343    self.adj[u][v] = keydict 
    344    self.adj[v][u] = keydict 

TypeError: unhashable type: 'dict' 

प्रश्न कैसे मैं एक पांडा dataframe से एक MultiGraph() का दृष्टांत करते हैं?

उत्तर

6

यह एक बग, एक मुद्दा GitHub पर, खोला है एक बार मैं सुझाव edit बनाया:

बदली हुई लाइन convert_matrix.py की 211 पढ़ने के लिए करने के लिए:

कि परिवर्तन से
g.add_edge(row[src_i], row[tar_i], attr_dict={i:row[j] for i, j in edge_i}) 

परिणाम:

MG= nx.from_pandas_dataframe(df, 'gene1', 'gene2', edge_attr=['conf','type'], 
           create_using=nx.MultiGraph()) 

In [5]: MG.edges(data=True) 
Out[5]: [('geneA', 'geneB', {'conf': 0.05, 'type': 'method1'}), 
     ('geneA', 'geneB', {'conf': 0.45, 'type': 'method2'}), 
     ('geneA', 'geneC', {'conf': 0.45, 'type': 'method1'}), 
     ('geneA', 'geneD', {'conf': 0.35, 'type': 'method1'})] 
+1

यह 'मल्टीडिग्राफ' के लिए बिल्कुल वही काम करता है – LancelotHolmes

4

यह एक अच्छा सवाल है। मैं आपकी समस्या को एक अलग तरीके से अपने MultiGraph() निर्माण, साथ ही तीन/चार स्तंभों का उपयोग पुन: पेश करने की कोशिश की:

MG = nx.MultiGraph() 

MG.add_weighted_edges_from([tuple(d) for d in df[['gene1','gene2','conf']].values]) 

यह सही रिटर्न MG.edges(data=True) के रूप में:

[('geneA', 'geneB', {'weight': 0.05}), ('geneA', 'geneB', {'weight': 0.45}), ('geneA', 'geneC', {'weight': 0.45}), ('geneA', 'geneD', {'weight': 0.35})] 

मैं का उपयोग कर अपने from_pandas_dataframe विधि के साथ भी करने की कोशिश की केवल तीन कॉलम लेकिन यह काम नहीं करता है:

MG = nx.from_pandas_dataframe(df, 'gene1', 'gene2', edge_attr='conf', create_using=nx.MultiGraph()) 

यह आपके सामने आने वाली वही त्रुटि देता है। मुझे नहीं पता कि यह एक बग है या वह विधि MultiGraph() के लिए एक से अधिक वजन प्रकार का समर्थन नहीं करती है। इस बीच आप कम से कम एक वजन प्रकार के साथ, अपने मल्टीग्राफ को बनाने के लिए उपर्युक्त कामकाज का उपयोग कर सकते हैं। उम्मीद है की वो मदद करदे।

+0

मैं अब के लिए वर्कअराउंड का उपयोग करूंगा, धन्यवाद, यह देखने में दिलचस्पी है कि किसी ने भी इसी तरह की त्रुटि देखी है। – Kevin

+0

@ केविन ... 2 साल बाद, मुझे एक ही त्रुटि मिली। मेरे मामले में, मैं 'मल्टीडिग्राफ() 'बनाने की कोशिश कर रहा हूं, लेकिन आपको वही त्रुटि मिली है। इस जवाब ने मेरी समस्या को हल किया – Sosi

संबंधित मुद्दे