Im Falle des Hinzufügens vieler Zeilen zum DataFrame interessiere ich mich für die Leistung. Also habe ich die vier beliebtesten Methoden ausprobiert und ihre Geschwindigkeit überprüft.
Leistung
- Verwendung von .append (NPE's Antwort)
- Verwendung von .loc (Fred's Antwort)
- Verwendung von .loc mit Vorbelegung (FooBar's Antwort)
- Verwendung von dict und Erstellen des DataFrame am Ende (ShikharDua's Antwort)
Ausführungszeitergebnisse (in Sekunden):
Ansatz
1000 Zeilen
5000 Zeilen
10 000 Zeilen
.append
0,69
3,39
6,78
.loc ohne Vorbelegung
0,74
3,90
8,35
.loc mit Vorbelegung
0,24
2,58
8,70
dict
0,012
0,046
0,084
Also verwende ich die Addition über das Wörterbuch für mich.
Code:
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('Vergangene Zeit: {:6.3f} Sekunden für {:d} Zeilen'.format(time.perf_counter() - startTime, numOfRows))
print(df1.shape)
# .loc ohne Vorbelegung
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('Vergangene Zeit: {:6.3f} Sekunden für {:d} Zeilen'.format(time.perf_counter() - startTime, numOfRows))
print(df2.shape)
# .loc mit Vorbelegung
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('Vergangene Zeit: {:6.3f} Sekunden für {:d} Zeilen'.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('Vergangene Zeit: {:6.3f} Sekunden für {:d} Zeilen'.format(time.perf_counter() - startTime, numOfRows))
print(df4.shape)
P.S.: Ich glaube, meine Realisierung ist nicht perfekt, und vielleicht gibt es Optimierungen, die vorgenommen werden könnten.