Die einfache Aufgabe, eine Zeile zu einem pandas.DataFrame
Objekt hinzufügen, scheint schwer zu erreichen. Es gibt 3 Stackoverflow-Fragen in diesem Zusammenhang, von denen keine eine funktionierende Antwort gibt.Python pandas: füllen einen Datenblock Zeile für Zeile
Hier ist, was ich versuche zu tun. Ich habe einen DataFrame, von dem ich sowohl die Form als auch die Namen der Zeilen und Spalten kenne.
>>> 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 pandas.Series
ausfüllen? 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 versuchte es, 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 wenig informative 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)
Scheinbar nur zum Setzen 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 will nicht, um den Index zu ignorieren, sonst hier ist 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
Es hat die Spaltennamen mit den Werten ausrichten, aber die Zeilenbeschriftungen 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.
Also, wie machst du es?
ich sehe. Also definiert das Attribut 'loc' des Datenrahmens ein spezielles' __setitem__', das die Magie ausführt, die ich vermute. – xApple
Können Sie dies in einem Durchgang konstruieren (d. H. Mit Spalten, Index und y)? –
Also, wenn ich eine Reihe auf einmal generieren kann, wie würde ich den Datenrahmen optimal aufbauen? – xApple