Стратифицированная выборка в Pandas
Я просмотрел склеарные стратифицированные документы для выборки, а также pandas docs, а также Стратифицированные образцы из Pandas и sclearn стратифицированная выборка на основе столбца, но они не решают эту проблему.
Im ищет быстрый способ pandas/sklearn/numpy для создания стратифицированных образцов размера n из набора данных. Однако для строк с меньшим, чем указанный номер выборки, он должен принимать все записи.
Конкретный пример:
![введите описание изображения здесь]()
Спасибо!:)
Ответы
Ответ 1
Используйте min
при передаче номера в образец. Рассмотрим блок данных df
df = pd.DataFrame(dict(
A=[1, 1, 1, 2, 2, 2, 2, 3, 4, 4],
B=range(10)
))
df.groupby('A', group_keys=False).apply(lambda x: x.sample(min(len(x), 2)))
A B
1 1 1
2 1 2
3 2 3
6 2 6
7 3 7
9 4 9
8 4 8
Ответ 2
Затратив на groupby
ответ, мы можем убедиться, что образец является сбалансированным. Для этого, когда для всех классов число выборок → = n_samples
, мы можем просто взять n_samples
(предыдущий ответ). Когда класс меньшинства содержит < n_samples
, мы можем считать, что количество образцов будет таким же, как и для класса меньшинства.
def stratified_sample_df(df, col, n_samples):
n = min(n_samples, df[col].value_counts().min())
df_ = df.groupby(col).apply(lambda x: x.sample(n))
df_.index = df_.index.droplevel(0)
return df_