69

我正在尝试使用 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]

出于某种原因,sklearn当我尝试在 SVM 分类器中使用这些生成的 DataFrame 对象之一时,会引发此错误:

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

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

4

5 回答 5

81

你用的是什么版本的熊猫?对我来说,您的代码运行良好(我在 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

于 2012-08-30T07:36:18.530 回答
79

我发现np.random.choice()NumPy 1.7.0 中的 new 对此非常有效。

例如,您可以传递来自 DataFrame 的索引值和整数 10 以选择 10 个随机均匀采样的行。

rows = np.random.choice(df.index.values, 10)
sampled_df = df.ix[rows]
于 2013-06-18T14:41:39.997 回答
25

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

于 2015-11-17T22:53:28.787 回答
15

Pandas 0.16.1 有一个示例方法。

于 2015-06-22T03:13:46.380 回答
6

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

于 2015-06-16T04:24:11.907 回答