Die einfache Aufgabe, einem pandas.DataFrame
Objekt eine Zeile hinzuzufügen, scheint schwer zu erfüllen zu sein. Es gibt 3 Fragen zum Stapelüberlauf, von denen keine eine funktionierende Antwort gibt.
Folgendes versuche ich zu tun. Ich habe einen DataFrame, dessen Form ich bereits kenne, sowie die Namen der Zeilen und Spalten.
>>> df = pandas.DataFrame(columns=['a','b','c','d'], index=['x','y','z'])
>>> df
a b c d
x NaN NaN NaN NaN
y NaN NaN NaN NaN
z NaN NaN NaN NaN
Jetzt habe ich eine Funktion, um die Werte der Zeilen iterativ zu berechnen. Wie kann ich eine der Zeilen mit einem Wörterbuch oder einem Wörterbuch ausfüllen pandas.Series
? Hier sind verschiedene Versuche, die fehlgeschlagen sind:
>>> y = {'a':1, 'b':5, 'c':2, 'd':3}
>>> df['y'] = y
AssertionError: Length of values does not match length of index
Anscheinend wurde versucht, eine Spalte anstelle einer Zeile hinzuzufügen.
>>> y = {'a':1, 'b':5, 'c':2, 'd':3}
>>> df.join(y)
AttributeError: 'builtin_function_or_method' object has no attribute 'is_unique'
Sehr uninformative Fehlermeldung.
>>> y = {'a':1, 'b':5, 'c':2, 'd':3}
>>> df.set_value(index='y', value=y)
TypeError: set_value() takes exactly 4 arguments (3 given)
Anscheinend dient das nur zum Einstellen einzelner Werte im Datenrahmen.
>>> y = {'a':1, 'b':5, 'c':2, 'd':3}
>>> df.append(y)
Exception: Can only append a Series if ignore_index=True
Nun, ich möchte den Index nicht ignorieren, sonst ist hier das Ergebnis:
>>> df.append(y, ignore_index=True)
a b c d
0 NaN NaN NaN NaN
1 NaN NaN NaN NaN
2 NaN NaN NaN NaN
3 1 5 2 3
Die Spaltennamen wurden zwar an den Werten ausgerichtet, die Zeilenbeschriftungen gingen jedoch verloren.
>>> y = {'a':1, 'b':5, 'c':2, 'd':3}
>>> df.ix['y'] = y
>>> df
a b \
x NaN NaN
y {'a': 1, 'c': 2, 'b': 5, 'd': 3} {'a': 1, 'c': 2, 'b': 5, 'd': 3}
z NaN NaN
c d
x NaN NaN
y {'a': 1, 'c': 2, 'b': 5, 'd': 3} {'a': 1, 'c': 2, 'b': 5, 'd': 3}
z NaN NaN
Das ist auch kläglich gescheitert.
Wie machst du das?
loc
Attribut des Datenrahmens definiert also ein Special__setitem__
, das die Magie ausübt, die ich vermute.df = pd.DataFrame({'y': pd.Series(y)}, columns=['a','b','c','d'], index=['x','y','z'])
funktioniert?Mein Ansatz war, aber ich kann nicht garantieren, dass dies die schnellste Lösung ist.
quelle
append
die Daten explizit in den Datenrahmen übertragen.Dies ist eine einfachere Version
quelle
Wenn Ihre Eingabezeilen eher Listen als Wörterbücher sind, ist Folgendes eine einfache Lösung:
quelle