এটি অনেক দিন হয়েছে, তবে আমিও একই সমস্যার মুখোমুখি হয়েছি। এবং এখানে অনেক আকর্ষণীয় উত্তর পেয়েছি। তাই আমি কোন পদ্ধতিটি ব্যবহার করতে হবে তা নিয়ে বিভ্রান্ত হয়ে পড়েছিলাম।
আমি আগ্রহী ডেটা ফ্রেমে প্রচুর সারি যুক্ত করার ক্ষেত্রে গতির পারফরম্যান্সে । তাই আমি 4 টি সর্বাধিক জনপ্রিয় পদ্ধতি চেষ্টা করেছি এবং তাদের গতি পরীক্ষা করেছি।
2019 সালে আপডেট হয়েছে প্যাকেজের নতুন সংস্করণ ব্যবহার করে । @ ফুবার মন্তব্যের পরেও আপডেট হয়েছে
স্পিড পারফরম্যান্স
- .Append ব্যবহার করে ( উত্তর )
- .Loc ব্যবহার করে ( উত্তর ) ব্যবহার করা
- Preallocating সহ .loc ব্যবহার ( 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 |
|------------|-------------|-------------|-------------|
এছাড়াও ধন্যবাদ দরকারী মন্তব্য @ ক্রাসসোভস্কিকে - আমি কোডটি আপডেট করেছি।
তাই আমি অভিধানের মাধ্যমে সংযোজনটি নিজের জন্য ব্যবহার করি।
কোড:
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)
পিএস আমি বিশ্বাস করি, আমার উপলব্ধি নিখুঁত নয় এবং সম্ভবত কিছু অপ্টিমাইজেশন রয়েছে।