यह एक लंबा समय रहा है, लेकिन मुझे भी यही समस्या आई। और यहाँ बहुत सारे दिलचस्प जवाब मिले। तो मैं उलझन में था कि किस विधि का उपयोग करूं।
गति प्रदर्शन में रुचि रखने वाले डेटाफ्रेम में बहुत सी पंक्तियों को जोड़ने के मामले में । इसलिए मैंने 4 सबसे लोकप्रिय तरीकों की कोशिश की और उनकी गति की जाँच की।
पैकेजों के नए संस्करणों का उपयोग करके 2019 में अद्यतन किया गया । @FooBar कमेंट के बाद भी अपडेट किया गया
स्पीड प्रदर्शन
- .Append ( NPE's उत्तर ) का उपयोग करना
- .Loc का उपयोग करना ( fred's answer )
- का उपयोग करना। उपदेश देने के साथ। FooBar का जवाब )
- तानाशाही का उपयोग करना और अंत में डेटाफ़्रेम बनाना ( शिखरदुआ का जवाब )
परिणाम (सेकंड में):
|------------|-------------|-------------|-------------|
| Approach | 1000 rows | 5000 rows | 10 000 rows |
|------------|-------------|-------------|-------------|
| .append | 0.69 | 3.39 | 6.78 |
|------------|-------------|-------------|-------------|
| .loc w/o | 0.74 | 3.90 | 8.35 |
| prealloc | | | |
|------------|-------------|-------------|-------------|
| .loc with | 0.24 | 2.58 | 8.70 |
| prealloc | | | |
|------------|-------------|-------------|-------------|
| dict | 0.012 | 0.046 | 0.084 |
|------------|-------------|-------------|-------------|
उपयोगी टिप्पणी के लिए @krassowski का भी धन्यवाद - मैंने कोड अपडेट किया।
इसलिए मैं खुद के लिए शब्दकोश के माध्यम से इसके अलावा का उपयोग करता हूं।
कोड:
import pandas as pd
import numpy as np
import time
del df1, df2, df3, df4
numOfRows = 1000
# append
startTime = time.perf_counter()
df1 = pd.DataFrame(np.random.randint(100, size=(5,5)), columns=['A', 'B', 'C', 'D', 'E'])
for i in range( 1,numOfRows-4):
df1 = df1.append( dict( (a,np.random.randint(100)) for a in ['A','B','C','D','E']), ignore_index=True)
print('Elapsed time: {:6.3f} seconds for {:d} rows'.format(time.perf_counter() - startTime, numOfRows))
print(df1.shape)
# .loc w/o prealloc
startTime = time.perf_counter()
df2 = pd.DataFrame(np.random.randint(100, size=(5,5)), columns=['A', 'B', 'C', 'D', 'E'])
for i in range( 1,numOfRows):
df2.loc[i] = np.random.randint(100, size=(1,5))[0]
print('Elapsed time: {:6.3f} seconds for {:d} rows'.format(time.perf_counter() - startTime, numOfRows))
print(df2.shape)
# .loc with prealloc
df3 = pd.DataFrame(index=np.arange(0, numOfRows), columns=['A', 'B', 'C', 'D', 'E'] )
startTime = time.perf_counter()
for i in range( 1,numOfRows):
df3.loc[i] = np.random.randint(100, size=(1,5))[0]
print('Elapsed time: {:6.3f} seconds for {:d} rows'.format(time.perf_counter() - startTime, numOfRows))
print(df3.shape)
# dict
startTime = time.perf_counter()
row_list = []
for i in range (0,5):
row_list.append(dict( (a,np.random.randint(100)) for a in ['A','B','C','D','E']))
for i in range( 1,numOfRows-4):
dict1 = dict( (a,np.random.randint(100)) for a in ['A','B','C','D','E'])
row_list.append(dict1)
df4 = pd.DataFrame(row_list, columns=['A','B','C','D','E'])
print('Elapsed time: {:6.3f} seconds for {:d} rows'.format(time.perf_counter() - startTime, numOfRows))
print(df4.shape)
पीएस मुझे विश्वास है, मेरा अहसास सही नहीं है, और शायद कुछ अनुकूलन है।