Нет, я не могу думать о каких-либо существенных улучшениях в этом отношении.
Дэн Аллан
Я получаю ошибку памяти на np.zeros, так как данных большой набор. Какие-нибудь намеки на то, что я могу сделать? Я не получил другого вывода, кроме "MemoryError". У меня 100 ГБ ОЗУ, а данных всего 20 ГБ, но все равно не работает. Не знаю, как его отлаживать, 64-битный сервер Ubuntu. Я немного погуглил, но все говорят - делить на куски, но эти данные нельзя разделить.
niedakh 09
Вы можете просто работать data? Зачем вам нужно создавать другую структуру, чтобы удерживать ее?
Филлип Клауд
Ответы:
144
Вы можете попробовать это:
d = pd.DataFrame(0, index=np.arange(len(data)), columns=feature_list)
Я считаю, что для проверки этого %timeit temp = np.zeros((10, 11)); d = pd.DataFrame(temp, columns = ['col1', 'col2',...'col11'])требуется 156 человек. Но %timeit d = pd.DataFrame(0, index = np.arange(10), columns = ['col1', 'col2',...'col11'])занимает 171 нас. Я удивлен, что это не быстрее.
emschorsch
3
Обратите внимание, что вы можете столкнуться с проблемой int / float, если вы будете делать что-то вроде d.set_value(params)после инициализации, dчтобы содержать 0. Легко исправить это: d = pd.DataFrame(0.0, index=np.arange(len(data)), columns=feature_list).
ximiki
30
На мой взгляд, лучше всего делать это с помощью numpy
import numpy as np
import pandas as pd
d = pd.DataFrame(np.zeros((N_rows, N_cols)))
Если вы хотите, чтобы новый фрейм данных имел тот же индекс и столбцы, что и существующий фрейм данных, вы можете просто умножить существующий фрейм данных на ноль:
Имейте в виду, что вы получите NaN вместо нулей везде, где df содержит NaN.
Кади
1
Если у вас уже есть фрейм данных, это самый быстрый способ:
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
Предполагая, что у вас есть шаблон 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.0100 loops, best of 3: 7.17 ms per loop
Улучшение зависит от размера DataFrame, но никогда не было медленнее.
И черт возьми:
In [24]: %timeit d = orig_df * 0.0 + 1.0100 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 и сделать общее решение, независимо от конкретного типа поплавка:
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
Это, безусловно, наиболее исчерпывающий ответ по времени, хотя для OP кажется, что проблема была в требованиях к памяти, а не в скорости ... Кстати, в моей системе первые два предложения, которые вы написали, дают одинаковое время (Pandas 0.20.3 ), так что, возможно, произошли некоторые изменения.
data
? Зачем вам нужно создавать другую структуру, чтобы удерживать ее?Ответы:
Вы можете попробовать это:
d = pd.DataFrame(0, index=np.arange(len(data)), columns=feature_list)
источник
%timeit temp = np.zeros((10, 11)); d = pd.DataFrame(temp, columns = ['col1', 'col2',...'col11'])
требуется 156 человек. Но%timeit d = pd.DataFrame(0, index = np.arange(10), columns = ['col1', 'col2',...'col11'])
занимает 171 нас. Я удивлен, что это не быстрее.d.set_value(params)
после инициализации,d
чтобы содержать 0. Легко исправить это:d = pd.DataFrame(0.0, index=np.arange(len(data)), columns=feature_list)
.На мой взгляд, лучше всего делать это с помощью numpy
import numpy as np import pandas as pd d = pd.DataFrame(np.zeros((N_rows, N_cols)))
источник
TypeError: 'numpy.float64' object does not support item assignment
np.float64
Подобно @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)
источник
Если вы хотите, чтобы новый фрейм данных имел тот же индекс и столбцы, что и существующий фрейм данных, вы можете просто умножить существующий фрейм данных на ноль:
df_zeros = df * 0
источник
Если у вас уже есть фрейм данных, это самый быстрый способ:
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
источник
Предполагая, что у вас есть шаблон 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 и сделать общее решение, независимо от конкретного типа поплавка:
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
источник