2016-09-30 4 views
2

Если я хочу случайным образом опробовать рамку данных pandas, я могу использовать pandas.DataFrame.sample.Отбор проб в пандах

Предположим, что я случайно опробовал 80% строк. Как автоматически получить остальные 20% строк, которые не были выбраны?

+1

Вы отбираете образцы с заменой или без? Если выборка без замены: просто добавьте столбец с уникальным индексом в dataframe. Затем посмотрите, какие номера индексов были выбраны в ваших 80%, и используйте их, чтобы получить оставшиеся 20%. – Lagerbaer

+0

В качестве альтернативы вы можете найти способ * перетасовать * весь фрейм данных, т. Е. Рандомизировать все строки, а затем просто разбить строки 80:20. – Lagerbaer

+0

без замены – wwl

ответ

3

Как поясняет Lagerbaer, можно добавить столбец с уникальным индексом в dataframe или случайным образом перетасовать весь блок данных. Для последних

df.reindex(np.random.permutation(df.index)) 

Работы. (np означает numpy)

2
>>> import pandas as pd, numpy as np 
>>> df = pd.DataFrame({'a': [1,2,3,4,5,6,7,8,9,10], 'b': [11,12,13,14,15,16,17,18,19,20]}) 
>>> df 
    a b 
0 1 11 
1 2 12 
2 3 13 
3 4 14 
4 5 15 
5 6 16 
6 7 17 
7 8 18 
8 9 19 
9 10 20 

# randomly sample 5 rows 
>>> sample = df.sample(5) 
>>> sample 
    a b 
7 8 18 
2 3 13 
4 5 15 
0 1 11 
3 4 14 

# list comprehension to get indices not in sample's indices 
>>> idxs_not_in_sample = [idx for idx in df.index if idx not in sample.index] 
>>> idxs_not_in_sample 
[1, 5, 6, 8, 9] 

# locate the rows at the indices in the original dataframe that aren't in the sample 
>>> not_sample = df.loc[idxs_not_in_sample] 
>>> not_sample 
    a b 
1 2 12 
5 6 16 
6 7 17 
8 9 19 
9 10 20 
Смежные вопросы