Если вы пришли сюда, чтобы выбрать строки из фрейма данных, включив те, чье значение столбца НЕ является ни одним из списка значений, вот как перевернуть ответ unutbu для списка значений выше:
df.loc[~df['column_name'].isin(some_values)]
(Чтобы не включать одно значение, конечно, вы просто используете обычный оператор не равно, !=
.)
Пример:
import pandas as pd
df = pd.DataFrame({'A': 'foo bar foo bar foo bar foo foo'.split(),
'B': 'one one two three two two one three'.split()})
print(df)
дает нам
A B
0 foo one
1 bar one
2 foo two
3 bar three
4 foo two
5 bar two
6 foo one
7 foo three
Подмножество только для тех строк, которые ARE NOT one
или three
в столбце B
:
df.loc[~df['B'].isin(['one', 'three'])]
дает
A B
2 foo two
4 foo two
5 bar two
Я не думаю, что этот цикл будет очень эффективным, потому что вам нужно перезапускать генератор случайных чисел каждый раз, когда он проходит цикл. Вместо этого я бы предложил взять большую выборку c('A', 'B', 'C', 'D')
с желаемыми вероятностями, затем посмотреть, когда вы впервые получили каждый элемент, и взять максимум из них. Это может потерпеть неудачу, если вам случится не рисовать какой-либо один тип, но с достаточно большой выборкой, которая становится невероятно маловероятной. Вот реализация моего предложения.
set.seed(1)
probs <- c(.1, .25, .25, .40)
samp <- sample(c('A', 'B', 'C', 'D'), size = 1000, replace = TRUE, prob = probs)
max(c(min(which(samp == 'A')), min(which(samp == 'B')), min(which(samp == 'C')), min(which(samp == 'D'))))
[1] 6
samp[1:6] # we get the final missing item on draw 6
[1] "D" "D" "C" "A" "D" "B"