2017-01-30 4 views
2

Ist es möglich, ein Pandas SparseArray zu initialisieren, indem nur die dichten Einträge bereitgestellt werden? Ich konnte das aus der Dokumentation nicht herausfinden: http://pandas.pydata.org/pandas-docs/stable/sparse.html.initialize pandas SparseArray

Zum Beispiel, ich möchte eine Länge 1000 SparseArray mit einer Eins bei Index 9 und Nullen überall sonst, wie würde ich über die Erstellung gehen? Dies ist eine Möglichkeit:

a = [0] * 1000 
a[9] = 1 
sparse_a = pd.SparseArray(data=a, fill_value=0) 

Aber in dem oben genannten müssen wir das dichte Array vor dem spärlichen erstellen. Gibt es eine Möglichkeit, nur die Indizes und die dichten Einträge anzugeben, um das SparseArray direkt zu erstellen?

Antwort

1

Eine Länge 10 SparseArray mit einem am Index 9 und Nullen überall sonst:

pd.SparseArray(1, index= range(1), kind='block', 
       sparse_index= BlockIndex(10, [8], [1]), 
       fill_value=0) 

Anmerkungen:

  1. index jede Liste sein könnte, solange seine Länge zu allen nicht gleich spärlicher Teil des Arrays (der kleinere Teil der Daten), in diesem Fall die Nummer 1 im spärlichen Array
  2. BlockIndex(10, [8], [1]) ist das Objekt, das auf die Positionen o zeigt f der nicht geparste Teil der Daten, wobei das erste Argument die TOTAL-Länge des Arrays ist (Sparse + Nicht-Sparse), ist das zweite Argument eine Liste von Startpositionen der Nicht-Sparse-Daten und das dritte Argument ist eine Liste wie lange jeder Block von nicht-spärlichen dauert. Hinweis:, dass die Länge der Anordnung in Punkt 1 erwähnt ist die Summe aller Elemente der Liste in dem dritten Argument dieses BlockIndex

So ein allgemeineres Beispiel ist: auf eine Länge 20 SparseArray zu machen, wo die 2., 3., 6., 7., 8. Elemente sind 1 und der Rest ist 0:

pd.SparseArray(1, index= range(5), kind='block', 
       sparse_index= BlockIndex(20, [1,5], [2,3]), 
       fill_value=0) 

oder

pd.SparseArray(1, index= [None, 3, 2, 7, np.inf], kind='block', 
       sparse_index= BlockIndex(20, [1,5], [2,3]), 
       fill_value=0) 

Leider kenne ich keinen guten Weg, um ein Array von nicht-sparsed Daten als das erste Argument für SparseArray zu spezifizieren - es bedeutet nicht, dass es nicht gemacht werden kann, das ist nur ein Disclaimer. Ich denke, solange Sie index=...pandas angeben, benötigen Sie einen Skalar für das erste Argument (die Daten).

Getestet auf Windows 7, Pandas Version 0.20.2 installiert von Aconda.

+0

Ich bekomme einen 'BlockIndex' nicht definierten Fehler. Wie rufe ich BlockIndex auf? Ich habe versucht, es nachzuschlagen, konnte aber keinen Weg finden – jagdish

+0

@jagdish Aus der Testdatei https://github.com/pandas-dev/pandas/blob/e99f56e43ab65710a34440067efe372d5f74280b/pandas/tests/sparse/test_libsparse.py des Pandas Repo selbst: 'von pandas.core.sparse.array Import BlockIndex' – TuanDT

+0

perfekt, danke! – jagdish