2016-04-06 8 views
0

Ich habe Whole_mat als Pandas df. corpus_index als gültige Zeilen, die ich in New_mat kopieren möchte, und ich möchte nur Spaltennummern 1, 4 und 7. Aber Reihenfolge sollte 7, 1, 4 sein. Unten ist, was ich versuchte, aber ich erhalte TypeError: unhashable Typ: ' Liste'. Die ganze Mattenform ist, sagen wir, Nx10, ich möchte nx3 für New_mat.Wie durch pandas Datenrahmen Schleife, um bestimmte Zeilen und ausgewählte Spalten zu extrahieren

New_mat = [] 
for i in range(len(corpus_index): 
    index = corpus_index[i] 
    New_mat.append(Whole_mat[[index], [7,1,4]]) 
print New_mat 

Was könnte ein besserer Weg sein, mein Problem zu lösen?

+0

Wahrscheinlich sollten Sie 'New_mat.append (Whole_mat.loc [index, [7,1,4]])' Wenn Sie 7, 1, 4 als Spaltennamen haben –

+0

Das wirft errro "'Keine von [[[ 7, 1, 4]] sind in den [Spalten] '". Muss ich Spaltennamen als String angeben? wie ["user_id", "phone_no"]? – impossible

+0

Ja, du solltest. Sie könnten auch 'columns' mit' New_mat.append (Whole_mat.loc [index, Whole_mat.columns [7,1,4]]) 'übergeben. * Hinweis * Index begann von 0. –

Antwort

0

Alles, was Sie brauchen einfache Indizierung ist. Beispiel:

In [1]: import pandas as pd 

In [2]: import numpy as np 

In [3]: df = pd.DataFrame([np.random.rand(10) for _ in xrange(10)]) 

In [4]: df.ix[[1,4,5],[3,4,5]] 
Out[4]: 
      3   4   5 
1 0.523302 0.104327 0.672953 
4 0.303693 0.785685 0.080759 
5 0.955738 0.987779 0.410638 

Mehr Infos hier: http://pandas.pydata.org/pandas-docs/stable/indexing.html

Und wenn Sie Pandas verwenden, vermeiden „Looping“ so viel wie möglich (es ist nicht notwendig, sehr oft). Der ganze Zweck der Pandas ist die Vektorisierung.

+0

Danke für den Vorschlag. Ich werde es lernen. Ich habe obige Methode verwendet und habe ''. Welches Objekt ist nun New_mat? Wie kann ich es benutzen? Ich habe versucht New_mat.head(), New_mat drucken, aber nichts hilft. – impossible

+0

Sie haben wahrscheinlich '.ix()' und nicht '.ix []' verwendet. Sie benötigen Klammern, keine Klammern. –

+0

Super! Es funktionierte. Aber was ist der Unterschied zwischen '.ix() und .ix []'? – impossible

1

Ich glaube nicht, Sie müssen für Schleife iterieren verwenden, können Sie versuchen, diese zu tun,

New_mat = Whole_mat.loc[corpus_index.index, Whole_mat.columns[[7, 1, 4]]] 

Hinweis: Spalten Indizes beginnen bei 0.

+0

Sie müssen im Allgemeinen keine Zeilen durchgehen ein Datenrahmen, und was noch wichtiger ist, sollte * nicht * sein, da es normalerweise viel langsamer ist als die vektorisierten Operationen, die in Pandas eingebaut sind. – Marius

Verwandte Themen