#python-3.x #pandas
#python-3.x #pandas
Вопрос:
Допустим, у меня есть фрейм данных pandas, подобный этому:
CustomerId Product
1 Apple
2 Orange
3 Apple
4 Watermelon
... ...
1000 Apple
Предположим, что у меня есть 500 яблок в столбце product. Я хотел бы сохранить фрейм данных, который содержит 10% из 500 яблок (и 100% из других категорий, то есть я хотел бы иметь фрейм данных с 550 строками). Есть ли способ сделать это эффективно? Могут ли эти 10% оставшихся яблок быть выбраны случайным образом?
Ответ №1:
Найдите строки apple:
apples = df["Product"] == 'Apple'
Случайным образом выбирайте строки для сохранения:
HOW_MANY = 0.1 # 10%
keep = np.random.binomial(1, HOW_MANY, size=apples.sum()).astype(bool)
Объедините строки, отличные от apple, и строки Apple, чтобы сохранить:
results = pd.concat([df[~apples], df[apples][keep]])
Ответ №2:
Для этого вы могли бы использовать df.sample, который возвращает случайную выборку элементов:
condition = df['Product'] != 'Apple'
df_all = df[condition] #This data frame has 100% of all products
df_apple = df[~condition]
percent = int(o.1*df_apple.shape[0]) # calculate 10% of Apple products
df_all = df_all.append(df_all.sample(percent)) #Append random items of apple to df_all
Конечно, количество фреймов данных можно уменьшить, для лучшего понимания используется больше переменных.