Панды — Генерируют новые значения из Случайного выбора выборочных данных

#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 , а затем создает новые данные из образцов.