Membuat bingkai data panda yang diisi nol


105

Apa cara terbaik untuk membuat bingkai data panda berisi nol dengan ukuran tertentu?

Saya telah menggunakan:

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

Apakah ada cara yang lebih baik untuk melakukannya?


1
Tidak, saya tidak bisa memikirkan perbaikan substansial tentang itu.
Dan Allan

Saya mendapatkan Kesalahan Memori di np.zeros, karena datanya adalah kumpulan besar. Ada petunjuk tentang apa yang bisa saya lakukan? Saya tidak mendapatkan keluaran lain selain "MemoryError". Saya memiliki RAM 100GB dan datanya hanya 20GB tetapi masih gagal. Tidak tahu cara men-debugnya, server ubuntu 64bit. Saya mencari di Google sebentar tetapi semua orang mengatakan - bagi menjadi beberapa bagian, tetapi data ini tidak dapat dibagi.
niedakh

Bisakah kamu bekerja dengan saja data? Mengapa Anda perlu membuat struktur lain untuk menahannya?
Phillip Cloud

Jawaban:


144

Anda dapat mencoba ini:

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

2
Menguji ini, saya menemukan %timeit temp = np.zeros((10, 11)); d = pd.DataFrame(temp, columns = ['col1', 'col2',...'col11'])membutuhkan 156 kami. Tapi %timeit d = pd.DataFrame(0, index = np.arange(10), columns = ['col1', 'col2',...'col11'])membawa 171 kita. Saya terkejut itu tidak lebih cepat.
emschorsch

3
Perhatikan bahwa Anda mungkin mengalami masalah int / float jika Anda akan melakukan sesuatu seperti d.set_value(params)setelah menginisialisasi dberisi 0. Mudah memperbaiki adalah: d = pd.DataFrame(0.0, index=np.arange(len(data)), columns=feature_list).
ximiki

30

Paling baik melakukan ini dengan numpy menurut saya

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

1
Ketika saya melakukannya dengan cara ini, saya tidak dapat mengubah nilai "0". TypeError: 'numpy.float64' object does not support item assignment
RightmireM

@RightmireM Bagaimana tepatnya Anda mencoba mengubahnya? Anda benar, tipe datanya adalahnp.float64
AlexG

11

Mirip dengan @Shravan, tetapi tanpa penggunaan numpy:

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

Kemudian Anda dapat melakukan apa pun yang Anda inginkan dengannya:

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

8

Jika Anda ingin bingkai data baru memiliki indeks dan kolom yang sama dengan bingkai data yang sudah ada, Anda bisa mengalikan bingkai data yang ada dengan nol:

df_zeros = df * 0

2
Ketahuilah bahwa Anda akan mendapatkan NaN, bukan nol jika df berisi NaN.
kadee

1

Jika Anda sudah memiliki dataframe, inilah cara tercepat:

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

Dibandingkan dengan:

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

Dengan asumsi memiliki template DataFrame, mana yang ingin disalin dengan nilai nol diisi di sini ...

Jika Anda tidak memiliki NaN dalam kumpulan data Anda, mengalikan dengan nol bisa jauh lebih cepat:

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

Peningkatan bergantung pada ukuran DataFrame, tetapi tidak pernah menemukannya lebih lambat.

Dan hanya untuk itu:

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

Tapi:

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

EDIT !!!

Dengan asumsi Anda memiliki bingkai yang menggunakan float64, ini akan menjadi yang tercepat dengan margin yang sangat besar! Itu juga dapat menghasilkan nilai apa pun dengan mengganti 0,0 ke nomor isian yang diinginkan.

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

Tergantung pada selera, seseorang dapat mendefinisikan nan secara eksternal, dan melakukan solusi umum, terlepas dari jenis float tertentu:

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
Ini jelas merupakan jawaban paling komprehensif tentang waktu, meskipun untuk OP tampaknya persyaratan memori adalah masalahnya dan bukan kecepatan ... Ngomong-ngomong, pada sistem saya, dua saran pertama yang Anda tulis memberikan waktu yang sama (Pandas 0.20.3 ), jadi mungkin ada beberapa perubahan.
Diperbolehkan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.