1412 Stimmen

Erstellen Sie ein Pandas-Datenframe, indem Sie Zeile für Zeile hinzufügen

Wie erstelle ich ein leeres DataFrame und füge dann Zeilen einzeln hinzu?

Ich habe ein leeres DataFrame erstellt:

df = pd.DataFrame(columns=('lib', 'qty1', 'qty2'))

Dann kann ich eine neue Zeile am Ende hinzufügen und ein einzelnes Feld ausfüllen mit:

df = df._set_value(index=len(df), col='qty1', value=10.0)

Das funktioniert nur für ein Feld auf einmal. Gibt es einen besseren Weg, um eine neue Zeile zum df hinzuzufügen?

133voto

FooBar Punkte 14972

Wenn Sie die Anzahl der Einträge ex ante kennen, sollten Sie den Speicherplatz durch Angabe des Index vorweg reservieren (indem Sie das Datenbeispiel aus einer anderen Antwort verwenden):

import pandas as pd
import numpy as np
# wir wissen, dass wir 5 Datensätze haben werden
numberOfRows = 5
# DataFrame erstellen
df = pd.DataFrame(index=np.arange(0, numberOfRows), columns=('lib', 'qty1', 'qty2') )

# jetzt füllen wir es zeilenweise auf
for x in np.arange(0, numberOfRows):
    #loc oder iloc funktionieren hier beide, da der Index natürliche Zahlen sind
    df.loc[x] = [np.random.randint(-1,1) for n in range(3)]
In[23]: df
Out[23]: 
   lib  qty1  qty2
0   -1    -1    -1
1    0     0     0
2   -1     0    -1
3    0    -1     0
4   -1     0     0

Geschwindigkeitsvergleich

In[30]: %timeit tryThis() # Funktionswrapper für diese Antwort
In[31]: %timeit tryOther() # Funktionswrapper ohne Index (siehe z.B. @fred)
1000 loops, best of 3: 1.23 ms pro Schleife
100 loops, best of 3: 2.31 ms pro Schleife

Und - wie aus den Kommentaren hervorgeht - wird der Geschwindigkeitsunterschied mit einer Größe von 6000 noch größer:

Wenn die Größe des Arrays (12) und die Anzahl der Zeilen (500) erhöht werden, wird der Geschwindigkeitsunterschied gravierender: 313ms vs 2.29s

94voto

Lydia Punkte 2187
mycolumns = ['A', 'B']
df = pd.DataFrame(columns=mycolumns)
rows = [[1,2],[3,4],[5,6]]
for row in rows:
    df.loc[len(df)] = row

81voto

W.P. McNeill Punkte 14851

Sie können eine einzelne Zeile als Dictionary mit der Option ignore_index anhängen.

>>> f = pandas.DataFrame(data = {'Animal':['Kuh','Pferd'], 'Farbe':['blau', 'rot']})
>>> f
  Animal Farbe
0    Kuh  blau
1  Pferd   rot
>>> f.append({'Animal':'Maus', 'Farbe':'schwarz'}, ignore_index=True)
  Animal  Farbe
0    Kuh   blau
1  Pferd    rot
2  Maus  schwarz

79voto

Nasser Al-Wohaibi Punkte 4369

Für effizientes Anhängen siehe Wie man eine zusätzliche Zeile zu einem Pandas-Datenrahmen hinzufügt und Einstellung mit Vergrößerung.

Fügen Sie Zeilen über loc/ix auf nicht vorhandene Schlüsselindexdaten hinzu. Zum Beispiel:

In [1]: se = pd.Series([1,2,3])

In [2]: se
Out[2]:
0    1
1    2
2    3
dtype: int64

In [3]: se[5] = 5.

In [4]: se
Out[4]:
0    1.0
1    2.0
2    3.0
5    5.0
dtype: float64

Oder:

In [1]: dfi = pd.DataFrame(np.arange(6).reshape(3,2),
   .....:                 columns=['A','B'])
   .....:

In [2]: dfi
Out[2]:
   A  B
0  0  1
1  2  3
2  4  5

In [3]: dfi.loc[:,'C'] = dfi.loc[:,'A']

In [4]: dfi
Out[4]:
   A  B  C
0  0  1  0
1  2  3  2
2  4  5  4
In [5]: dfi.loc[3] = 5

In [6]: dfi
Out[6]:
   A  B  C
0  0  1  0
1  2  3  2
2  4  5  4
3  5  5  5

48voto

hkyi Punkte 3066

Zum Wohle auf Pythonische Weise:

res = pd.DataFrame(columns=('lib', 'qty1', 'qty2'))
res = res.append([{'qty1':10.0}], ignore_index=True)
print(res.head())

   lib  qty1  qty2
0  NaN  10.0   NaN

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X