2016-04-06 4 views
0

私はWhole_matをpandas dfとして持っています。私はNew_matにコピーしたい有効な行としてcorpus_indexを使用していますが、列番号1,4、および7だけが必要です。しかし、順序は7,1,4です。以下は私が試みたものですが、TypeErrorを取得しています。リスト'。全体的なマットの形状は、例えば、Nx10であり、New_matにはnx3が必要です。特定の行と選択した列を抽出するためにpandasデータフレームをループする方法

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

おそらく 'New_mat.append(Whole_mat.loc [index、[7,1,4]])'カラム名として7、1、4がある場合 –

+0

それはerrroを投げている '' [ 7、1,4]]は[列] ''にあります。列名を文字列として与える必要がありますか? ["user_id"、 "phone_no"]のように? – impossible

+0

はい、そうすべきです。また、 'New_mat.append(Whole_mat.loc [index、Whole_mat.columns [7,1,4]])'で 'columns'を渡すこともできます。 *注*インデックスは0から始まった。 –

答えて

0

から始める必要なのは、単純なインデックスです。例:ここ

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

そして、あなたはパンダを使用しているときはいつでも、できるだけ多くの「ループ」を避けるため(それは非常にしばしば必要ではありません)。パンダを使用する目的はベクトル化です。

+0

ありがとうございます。私はそれを学ぶでしょう。私は上記の方法を使い、 ''を得ました。今、New_matは何の対象ですか?どうすればそれを使うことができますか?私はNew_mat.head()を試してみましたが、New_matを印刷しましたが、何も助けていません。 – impossible

+0

おそらく '.ix()'ではなく '.ix()'を使ったでしょう。かっこは必要ありません。 –

+0

恐ろしい!出来た。しかし、.ix()と.ix [] 'の違いは何ですか? – impossible

1

私はあなたがforループを使用して反復する必要はないと思う、あなたはこれをやってみてください、

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

注:列のインデックスは0

+0

一般的に、行の中でループする必要はありません。データフレーム、そしてもっと重要なのは、パンダに組み込まれているベクトル化された操作を使用するよりも、通常はずっと遅いからです。 – Marius

関連する問題