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]
Ответ 3
Новое в версии 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
Ответ 4
Pandas 0.16.1 имеют sample метод для этого.
Ответ 5
Если вы используете pandas.read_csv, вы можете напрямую попробовать при загрузке данных с помощью параметра skiprows. Вот короткая статья, которую я написал об этом - https://nikolaygrozev.wordpress.com/2015/06/16/fast-and-simple-sampling-in-pandas-when-loading-data-from-files/