pandas:采样dataframe

我试图读pandas一个相当大的CSV文件,并将其分成两个随机的块,其中一个是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] 

出于某种原因,当我试图在SVM分类器中使用这些DataFrame对象之一时, sklearn抛出这个错误:

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

我觉得我做错了。 有一个更好的方法吗?

你使用的是什么版本的pandas? 对我来说,你的代码工作正常(我在Git主)。

另一种方法可能是:

 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的索引值,以select10个随机均匀采样的行。

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

pandas0.16.1有一个样本方法。

0.16.1版新增function:

 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

如果您使用的是pandas.read_csv,则可以使用skiprows参数在加载数据时直接进行采样。 这里是我写的一篇简短的文章 – https://nikolaygrozev.wordpress.com/2015/06/16/fast-and-simple-sampling-in-pandas-when-loading-data-from-files/