web-dev-qa-db-ja.com

パンダ:DataFrameのサンプリング

Pandasでかなり大きな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分類器内でこれらの結果のDataFrameオブジェクトのいずれかを使用しようとすると、sklearnはこのエラーをスローします。

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

私はそれを間違っていると思います。これを行うためのより良い方法はありますか?

68
Blender

pandasのどのバージョンを使用していますか?私にとっては、コードは正常に動作します(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

80

NumPy 1.7.0の新しいnp.random.choice()がこれに非常にうまく機能することがわかりました。

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

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

バージョン0.16.1の新機能:

sample_dataframe = your_dataframe.sample(n=how_many_rows_you_want)

こちらのドキュメント: http://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.DataFrame.sample.html

24
dval

パンダ0.16.1には sample メソッドがあります。

14
hurrial

Pandas.read_csvを使用している場合、skiprowsパラメーターを使用して、データを読み込むときに直接サンプリングできます。これについて私が書いた短い記事があります- https://nikolaygrozev.wordpress.com/2015/06/16/fast-and-simple-sampling-in-pandas-when-loading-data- from-files /

6
Nikolay