Подтвердить что ты не робот

Создание кадра с нулевым заполнением pandas

Каков наилучший способ создания кадра с нулевым заполнением pandas заданного размера?

Я использовал:

zero_data = np.zeros(shape=(len(data),len(feature_list)))
d = pd.DataFrame(zero_data, columns=feature_list)

Есть ли лучший способ сделать это?

4b9b3361

Ответ 1

Вы можете попробовать следующее:

d = pd.DataFrame(0, index=np.arange(len(data)), columns=feature_list)

Ответ 2

Лучше всего сделать это с NumPy по моему мнению

import numpy as np
import pandas as pd
d = pd.DataFrame(np.zeros((N_rows, N_cols)))

Ответ 3

Аналогично @Shravan, но без использования numpy:

  height = 10
  width = 20
  df_0 = pd.DataFrame(0, index=range(height), columns=range(width))

Затем вы можете делать с ним все, что хотите:

post_instantiation_fcn = lambda x: str(x)
df_ready_for_whatever = df_0.applymap(post_instantiation_fcn)

Ответ 4

Если у вас уже есть dataframe, это самый быстрый способ:

In [1]: columns = ["col{}".format(i) for i in range(10)]
In [2]: orig_df = pd.DataFrame(np.ones((10, 10)), columns=columns)
In [3]: %timeit d = pd.DataFrame(np.zeros_like(orig_df), index=orig_df.index, columns=orig_df.columns)
10000 loops, best of 3: 60.2 µs per loop

Сравнить с:

In [4]: %timeit d = pd.DataFrame(0, index = np.arange(10), columns=columns)
10000 loops, best of 3: 110 µs per loop

In [5]: temp = np.zeros((10, 10))
In [6]: %timeit d = pd.DataFrame(temp, columns=columns)
10000 loops, best of 3: 95.7 µs per loop

Ответ 5

Предполагая наличие шаблона DataFrame, который нужно скопировать с нулевыми значениями, заполненными здесь...

Если у вас нет NaN в вашем наборе данных, умножение на ноль может быть значительно быстрее:

In [19]: columns = ["col{}".format(i) for i in xrange(3000)]                                                                                       

In [20]: indices = xrange(2000)

In [21]: orig_df = pd.DataFrame(42.0, index=indices, columns=columns)

In [22]: %timeit d = pd.DataFrame(np.zeros_like(orig_df), index=orig_df.index, columns=orig_df.columns)
100 loops, best of 3: 12.6 ms per loop

In [23]: %timeit d = orig_df * 0.0
100 loops, best of 3: 7.17 ms per loop

Улучшение зависит от размера DataFrame, но никогда не находило его медленнее.

И просто для этого:

In [24]: %timeit d = orig_df * 0.0 + 1.0
100 loops, best of 3: 13.6 ms per loop

In [25]: %timeit d = pd.eval('orig_df * 0.0 + 1.0')
100 loops, best of 3: 8.36 ms per loop

Но:

In [24]: %timeit d = orig_df.copy()
10 loops, best of 3: 24 ms per loop

ИЗМЕНИТЬ!!!

Предполагая, что у вас есть фрейм с использованием float64, это будет самым быстрым с огромным запасом! Он также может генерировать любое значение, заменяя 0.0 на нужный номер заполнения.

In [23]: %timeit d = pd.eval('orig_df > 1.7976931348623157e+308 + 0.0')
100 loops, best of 3: 3.68 ms per loop

В зависимости от вкуса, внешнее определение nan и общее решение, независимо от конкретного типа float:

In [39]: nan = np.nan
In [40]: %timeit d = pd.eval('orig_df > nan + 0.0')
100 loops, best of 3: 4.39 ms per loop

Ответ 6

Если вы хотите, чтобы новый фрейм данных имел тот же индекс и столбцы, что и существующий фрейм данных, вы можете просто умножить существующий фрейм данных на ноль:

df_zeros = df * 0