Стратифицированная выборка в 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_