Имам Whole_mat като pandas df. corpus_index като валидни редове, които искам да копирам в New_mat и искам само колони номера 1, 4 и 7. Но трябва да бъде 7, 1, 4. По-долу е това, което аз се опитах, но аз съм се TypeError: unhashable тип: списък ". Цялата мат форма е, да речем, Nx10, искам nx3 за New_mat.
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
Какво би могло да бъде по-добър начин за решаване на проблема ми?
Отговори:
0 за отговор № 1Всичко, от което се нуждаете, е просто индексиране. Пример:
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
Повече информация тук: http://pandas.pydata.org/pandas-docs/stable/indexing.html
И винаги, когато използвате панди, избягвайте колкото се може по-скоро (не е необходимо много често). Цялата цел на използването на панди е векторността.
1 за отговор № 2
Аз не мисля, че трябва да итерат, използвайки за цикъл, бихте могли да опитате да направите това,
New_mat = Whole_mat.loc[corpus_index.index, Whole_mat.columns[[7, 1, 4]]]
Забележка: Индексите на колоните започват от 0.