#python #pandas
Вопрос:
У меня есть образец набора данных с 1 миллионом записей. Я хочу выбрать случайное значение из каждого столбца, чтобы сгенерировать новую строку для создания образца набора данных с 3 миллионами строк. Я нашел способ сделать это, однако для этого требуется около 1 секунды на строку. Есть ли способ сделать это более эффективным и быстрым?
newRows = 3000000
newData = pd.DataFrame()
start = time.time()
for i in range(newRows):
dict = {}
for column in source.columns:
dict[column] = [source.sample()[column].values[0]]
newData = newData.append(dict,ignore_index=True)
end = time.time()
elasped = end - start
print(elasped)
print(newRows/elasped)
Комментарии:
1. Сколько столбцов в вашем фрейме данных?
2. @not_speshal 24 колонки
Ответ №1:
Попробуйте с numpy.random.choice
:
import numpy as np
indices = np.random.choice(df.index, size=(newRows, df.shape[1]), replace=True)
newData = pd.DataFrame(data=source.to_numpy()[indices, np.arange(len(source.columns))],
columns=source.columns)
Или:
newData = source.apply(np.random.choice, size=newRows, replace=True)
Комментарии:
1.
.apply(np.random.choice, size=newRows, replace=True)
.2. Спасибо @QuangHoang — Думаю, что отредактированный (теперь первый) метод все же лучше!
Ответ №2:
Петли по столбцам, проба по 3 м от каждого. Затем создайте новый фрейм данных:
newRows = 3000000
newData = pd.DataFrame({
c: source[c].sample(n=newRows, replace=True).values
for c in source.columns # `for c in source` works as well
})
Комментарии:
1. Можете ли вы подробнее рассказать о том, как это работает? Я пытаюсь понять, чтобы тоже извлечь из этого урок. Спасибо!
2. @Dan Я не уверен, что нужно уточнять. Код по существу представляет собой выборку значений 3M из каждого столбца
source[c].sample
, а затем создает новые данные из образцов.