Выборка в pandas

#python #pandas

#python #pandas

Вопрос:

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

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

Комментарии:

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

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

3. без замены

Ответ №1:

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

 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