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
私はそれを間違っていると思います。これを行うためのより良い方法はありますか?
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
NumPy 1.7.0の新しいnp.random.choice()
がこれに非常にうまく機能することがわかりました。
たとえば、DataFrameのインデックス値と整数10を渡して、10個のランダムに均一にサンプリングされた行を選択できます。
rows = np.random.choice(df.index.values, 10)
sampled_df = df.ix[rows]
バージョン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
パンダ0.16.1には sample メソッドがあります。
Pandas.read_csvを使用している場合、skiprowsパラメーターを使用して、データを読み込むときに直接サンプリングできます。これについて私が書いた短い記事があります- https://nikolaygrozev.wordpress.com/2015/06/16/fast-and-simple-sampling-in-pandas-when-loading-data- from-files /