Створення нульового заповненого кадру даних панд


103

Який найкращий спосіб створити заповнений нулем кадр даних панд заданого розміру?

Я використав:

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

Чи є кращий спосіб це зробити?


1
Ні, я не можу подумати про якесь істотне покращення цього.
Dan Allan,

Я отримую помилку пам'яті на np.zeros, оскільки даних є великим набором. Будь-які підказки щодо того, що я можу зробити? Я не отримав жодного іншого виходу, крім "MemoryError". У мене 100 ГБ оперативної пам’яті, а даних лише 20 ГБ, але все одно не вдається. Не знаю, як його налагодити, 64-бітний сервер ubuntu. Я трохи погуглив, але всі кажуть - розділіть на шматки, але ці дані не можна розділити.
niedakh

Ви можете просто працювати data? Навіщо потрібно створювати іншу структуру, щоб утримувати її?
Phillip Cloud

Відповіді:


137

Ви можете спробувати це:

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

2
Тестування цього я знаходжу %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

29

На мою думку, найкраще це робити з numpy

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

1
Коли я робив це таким чином, я не міг змінити значення "0". TypeError: 'numpy.float64' object does not support item assignment
RightmireM

@RightmireM Як саме ви намагаєтесь їх змінити? Ви маєте рацію, тип данихnp.float64
AlexG

11

Подібно до @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)

8

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

df_zeros = df * 0

2
Майте на увазі, що ви отримаєте 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

1

Якщо припустити наявність шаблону 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

Залежно від смаку, можна зовні визначити нан і зробити загальне рішення, незалежно від конкретного типу поплавця:

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

1
Це, безумовно, найбільш вичерпна відповідь щодо часу, хоча для ОП здається, що вимоги до пам'яті були проблемою, а не швидкістю ... До речі, у моїй системі перші дві пропозиції, які ви написали, дають однакові терміни (Pandas 0.20.3 ), тож, можливо, відбулися деякі зміни.
Moot
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.