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?

38voto

Brian Burns Punkte 17530

Sie können auch eine Liste von Listen erstellen und in ein DataFrame umwandeln -

import pandas as pd

columns = ['i','doppelt','quadrat']
rows = []

for i in range(6):
    row = [i, i*2, i*i]
    rows.append(row)

df = pd.DataFrame(rows, columns=columns)

Ergebnis

    i   doppelt quadrat
0   0   0   0
1   1   2   1
2   2   4   4
3   3   6   9
4   4   8   16
5   5   10  25

24voto

Prajot Kuvalekar Punkte 2872

Wenn Sie immer eine neue Zeile am Ende hinzufügen möchten, verwenden Sie dies:

df.loc[len(df)] = ['name5', 9, 0]

18voto

Qinsi Punkte 770

Ich habe einen einfachen und schönen Weg gefunden:

>>> df
     A  B  C
one  1  2  3
>>> df.loc["two"] = [4,5,6]
>>> df
     A  B  C
one  1  2  3
two  4  5  6

Beachten Sie den Hinweis zur Leistungsfähigkeit, wie in den Kommentaren erwähnt.

17voto

qwr Punkte 8006

Statt einer Liste von Wörterbüchern wie in ShikharDua's Antwort (zeilenbasiert) können wir unsere Tabelle auch als Wörterbuch von Listen (spaltenbasiert) darstellen, wobei jede Liste eine Spalte in Reihenfolge der Zeile speichert, sofern wir unsere Spalten im Voraus kennen. Am Ende erstellen wir unser DataFrame einmal.

In beiden Fällen sind die Wörterbuchschlüssel immer die Spaltennamen. Die Reihenfolge der Zeilen wird implizit als Reihenfolge in einer Liste gespeichert. Für c Spalten und n Zeilen verwendet dies ein Wörterbuch von c Listen im Vergleich zu einer Liste von n Wörterbüchern. Die Liste-der-Wörterbücher-Methode hat jedes Wörterbuch redundante alle Schlüssel speichern und erfordert das Erstellen eines neuen Wörterbuchs für jede Zeile. Hier fügen wir nur Listen hinzu, was insgesamt die gleiche Zeitkomplexität (Hinzufügen von Einträgen zu Liste und Wörterbuch sind beide amortisierte konstante Zeit) haben kann, aber möglicherweise weniger Overhead aufweist, da dies eine einfache Operation ist.

# Aktuelle Daten
data = {"Tier":["Kuh", "Pferd"], "Farbe":["blau", "rot"]}

# Hinzufügen einer neuen Zeile (Achten Sie darauf, dass jede Spalte einen weiteren Wert erhält)
data["Tier"].append("Maus")
data["Farbe"].append("schwarz")

# Am Ende, erstellen wir unser DataFrame
df = pd.DataFrame(data)
#    Tier Farbe
# 0   Kuh  blau
# 1 Pferd  rot
# 2  Maus schwarz

14voto

user3250815 Punkte 149

Dies ist keine Antwort auf die Frage des OP, sondern ein Beispiel, um ShikharDua's Antwort zu veranschaulichen, die ich sehr nützlich fand.

Während dieses Fragment trivial ist, hatte ich in den tatsächlichen Daten Tausende von Zeilen und viele Spalten, und ich wollte in der Lage sein, nach verschiedenen Spalten zu gruppieren und dann die unten aufgeführten Statistiken für mehr als eine Zielspalte durchzuführen. Daher war es eine große Bequemlichkeit, eine zuverlässige Methode zum Aufbau des Datenrahmens Zeile für Zeile zu haben. Danke ShikharDua!

import pandas as pd

BaseData = pd.DataFrame({ 'Kunde' : ['Acme','Mega','Acme','Acme','Mega','Acme'],
                          'Gebiet'  : ['Westen','Osten','Süden','Westen','Osten','Süden'],
                          'Produkt'  : ['Econ','Luxe','Econ','Std','Std','Econ']})
BaseData

columns = ['Kunde','Anzahl eindeutiger Produkte', 'Liste eindeutiger Produkte']

rows_list=[]
for name, group in BaseData.groupby('Kunde'):
    RecordtoAdd={} #initialisiere ein leeres dict
    RecordtoAdd.update({'Kunde' : name}) #
    RecordtoAdd.update({'Anzahl eindeutiger Produkte' : len(pd.unique(group['Produkt']))})
    RecordtoAdd.update({'Liste eindeutiger Produkte' : pd.unique(group['Produkt'])})

    rows_list.append(RecordtoAdd)

AnalysedData = pd.DataFrame(rows_list)

print('Basisdaten: \n',BaseData,'\n\n Analysierte Daten: \n',AnalysedData)

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