อะไรคือวิธีที่ดีที่สุดในการสร้างกรอบข้อมูลแพนด้าที่ไม่มีค่าเป็นศูนย์ในขนาดที่กำหนด
ฉันได้ใช้:
zero_data = np.zeros(shape=(len(data),len(feature_list)))
d = pd.DataFrame(zero_data, columns=feature_list)
มีวิธีที่ดีกว่านี้ไหม
อะไรคือวิธีที่ดีที่สุดในการสร้างกรอบข้อมูลแพนด้าที่ไม่มีค่าเป็นศูนย์ในขนาดที่กำหนด
ฉันได้ใช้:
zero_data = np.zeros(shape=(len(data),len(feature_list)))
d = pd.DataFrame(zero_data, columns=feature_list)
มีวิธีที่ดีกว่านี้ไหม
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
ขึ้นอยู่กับรสนิยมเราสามารถกำหนดน่านจากภายนอกและทำวิธีแก้ปัญหาทั่วไปโดยไม่คำนึงถึงประเภทลอยเฉพาะ:
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