2012-08-30 26 views
62

かなり大きなCSVファイルをパンダで読み込み、2つのランダムなチャンクに分割しようとしています.1つはデータの10%、もう1つは90%です。何らかの理由でパンダ:データフレームのサンプリング

rows = data.index 
row_count = len(rows) 
random.shuffle(list(rows)) 

data.reindex(rows) 

training_data = data[row_count // 10:] 
testing_data = data[:row_count // 10] 

、私はSVM分類器の内部でこれらの結果のデータフレームのオブジェクトのいずれかを使用しようとすると、sklearnは、このエラーがスローされます:

IndexError: each subindex must be either a slice, an integer, Ellipsis, or newaxis 

私が思う

は、ここに私の現在の試みです私は間違っているよ。これを行うより良い方法はありますか?

+3

、これはランダムにとにかく正しくシャッフルではないでしょう - 問題は、 'random.shuffle(リスト(行))です' 。 'shuffle'はそれが操作するデータを変更しますが、' list(rows) 'を呼び出すと、変更されてスローされた' rows'のコピーを作ります - 基礎となるパンダシリーズ 'rows'は変更されません。 1つの解決策は 'rows = list(rows)'を呼び出し、その後に 'random.shuffle(rows)'と 'data.reindex(rows)'を呼び出すことです。 –

答えて

76

あなたはどのバージョンのパンダを使用していますか?私にとってあなたのコードはうまく動作します(私はgit master上にあります)。

別のアプローチは次のようになります。

In [117]: import pandas 

In [118]: import random 

In [119]: df = pandas.DataFrame(np.random.randn(100, 4), columns=list('ABCD')) 

In [120]: rows = random.sample(df.index, 10) 

In [121]: df_10 = df.ix[rows] 

In [122]: df_90 = df.drop(rows) 

(上0.16.1からの)新しいバージョンでは、これを直接サポートしています。 http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.sample.html

+7

別のアプローチは、 'np.random.permuation'を使用することです。 –

+1

@WesMcKinney:' np.random.permutation'はDataFrameから列名を取り除くことに気付きます。列名を保持したままデータフレームをシャッフルする方法がありますか? – hlin117

+4

@hlin df.loc [np.random.permutation(df.index)]は、データフレームをシャッフルして列名を保持します。 –

77

numpyの1.7.0の新np.random.choice()がために非常によく機能することを私が発見しましたこの。

たとえば、インデックス値をDataFrameおよび整数10から渡して、ランダムに均等にサンプリングされた10個のランダムな行を選択できます。

rows = np.random.choice(df.index.values, 10) 
sampled_df = df.ix[rows] 
+0

をipython timeitで推薦すると、 'random.sample'時間の半分の時間がかかってしまいます.new.random.choiceの使用にはawhome – gc5

+0

+1が必要です。また、確率の 'pd.Series'を' prob'とすると、 'np.random.choice(prob.index.values、p = prob.values)' – LondonRob

+37

Don '置換せずにサンプリングしたい場合は、replace = Falseを指定するのを忘れないでください。そうしないと、このメソッドは同じ行を複数回サンプリングする可能性があります。 –

13

パンダ0.16.1にはsampleの方法があります。

+0

ニース!しかし、まだメモリにすべてのデータをロードする必要がありますか? – Nikolay

+0

私はそれをメモリにロードした後に行います。 – hurrial

17

バージョン0.16.1の新:ここ

sample_dataframe = your_dataframe.sample(n=how_many_rows_you_want) 

はDOC:ちなみにhttp://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.DataFrame.sample.html

+0

sample_dataframeを取得したら、それをyour_dataframeからどのように引きますか? –

+0

@ChrisNielsenクロスバリデーションができるように頼んでいますか?もしそうなら、私はhttp://scikit-learn.org/stable/modules/cross_validation.htmlをお勧めします。トレーニングとテストのすべてのデータセット(X_train、X_test、y_train、y_test)を直接提供します。 – dval

関連する問題