การสร้างกรอบข้อมูลแพนด้าที่เติมเป็นศูนย์


108

อะไรคือวิธีที่ดีที่สุดในการสร้างกรอบข้อมูลแพนด้าที่ไม่มีค่าเป็นศูนย์ในขนาดที่กำหนด

ฉันได้ใช้:

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

มีวิธีที่ดีกว่านี้ไหม


1
ไม่ฉันคิดไม่ออกว่าจะมีการปรับปรุงอะไรมากมาย
Dan Allan

ฉันได้รับข้อผิดพลาดหน่วยความจำบน np.zeros เนื่องจากข้อมูลเป็นชุดใหญ่ มีคำแนะนำเกี่ยวกับสิ่งที่ฉันทำได้หรือไม่? ฉันไม่มีเอาต์พุตอื่นนอกเหนือจาก "MemoryError" ฉันมี RAM 100GB และข้อมูลมีเพียง 20GB แต่ก็ยังล้มเหลว ไม่รู้จะแก้จุดบกพร่องเซิร์ฟเวอร์ ubuntu 64 บิตได้อย่างไร ฉัน googled เล็กน้อย แต่ทุกคนบอกว่า - แบ่งเป็นชิ้น ๆ แต่ไม่สามารถแบ่งข้อมูลนี้ได้
niedakh

คุณสามารถทำงานกับdata? ทำไมต้องสร้างโครงสร้างอื่นเพื่อยึดมัน?
Phillip Cloud

คำตอบ:


150

คุณสามารถลองสิ่งนี้:

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

32

เป็นการดีที่สุดที่จะทำสิ่งนี้โดยใช้ 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

13

คล้ายกับ @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
kadee

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
นี่เป็นคำตอบที่ครอบคลุมที่สุดในเรื่องเวลาแม้ว่าสำหรับ OP ดูเหมือนว่าความต้องการหน่วยความจำจะเป็นปัญหาและไม่ใช่ความเร็ว ... อย่างไรก็ตามในระบบของฉันคำแนะนำสองข้อแรกที่คุณเขียนให้เวลาเดียวกัน (นุ่น 0.20.3 ) ดังนั้นอาจมีการเปลี่ยนแปลงบางอย่าง
มูโอต์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.