我正在尝试用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
我想我做错了。有更好的方法吗?
答案 0 :(得分:80)
您使用的是哪个版本的熊猫?对我来说,你的代码工作正常(我在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
答案 1 :(得分:79)
我发现NumPy 1.7.0中的np.random.choice()
新功能对此非常有效。
例如,您可以从DataFrame传递索引值,并使用整数10来选择10个随机均匀采样的行。
rows = np.random.choice(df.index.values, 10)
sampled_df = df.ix[rows]
答案 2 :(得分:23)
0.16.1版中的新功能:
sample_dataframe = your_dataframe.sample(n=how_many_rows_you_want)
doc here:http://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.DataFrame.sample.html
答案 3 :(得分:14)
Pandas 0.16.1有sample方法。
答案 4 :(得分:6)
如果您正在使用pandas.read_csv,则可以使用skiprows参数在加载数据时直接进行采样。这是我写的一篇简短的文章 - https://nikolaygrozev.wordpress.com/2015/06/16/fast-and-simple-sampling-in-pandas-when-loading-data-from-files/