Pandas: выборка DataFrame

Я пытаюсь прочитать довольно большой файл CSV с помощью Pandas и разбить его на два случайных фрагмента, один из которых составляет 10% данных, а другой - 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]

По какой-то причине sklearn выдает эту ошибку, когда я пытаюсь использовать один из этих результирующих объектов DataFrame внутри классификатора SVM:

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

Я думаю, что я делаю это неправильно. Есть ли лучший способ сделать это?

Ответ 1

Какую версию pandas вы используете? Для меня ваш код работает отлично (i`m on 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

Ответ 2

Я обнаружил, что np.random.choice() new в NumPy 1.7.0 работает для этого достаточно хорошо.

Например, вы можете передать значения индекса из DataFrame и целое число 10, чтобы выбрать 10 случайных равномерно сэмплированных строк.

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

Ответ 4

Pandas 0.16.1 имеют sample метод для этого.