Wenn Sie hierher gekommen sind, um Informationen zum Zusammenführen von a
DataFrame
undSeries
zum Index zu erhalten , lesen Sie bitte diese Antwort .Die ursprüngliche Absicht des OP bestand darin, zu fragen, wie Serienelemente als Spalten einem anderen DataFrame zugewiesen werden sollen . Wenn Sie daran interessiert sind, die Antwort darauf zu erfahren , schauen Sie sich die von EdChum akzeptierte Antwort an.
Das Beste, was ich mir einfallen lassen kann, ist
df = pd.DataFrame({'a':[1, 2], 'b':[3, 4]}) # see EDIT below
s = pd.Series({'s1':5, 's2':6})
for name in s.index:
df[name] = s[name]
a b s1 s2
0 1 3 5 6
1 2 4 5 6
Kann jemand eine bessere Syntax / schnellere Methode vorschlagen?
Meine Versuche:
df.merge(s)
AttributeError: 'Series' object has no attribute 'columns'
und
df.join(s)
ValueError: Other Series must have a name
BEARBEITEN Die ersten beiden Antworten haben ein Problem mit meiner Frage hervorgehoben. Verwenden Sie daher zum Konstruieren Folgendes df
:
df = pd.DataFrame({'a':[np.nan, 2, 3], 'b':[4, 5, 6]}, index=[3, 5, 6])
mit dem Endergebnis
a b s1 s2
3 NaN 4 5 6
5 2 5 5 6
6 3 6 5 6
df
unds
gibt diese Antwort für mich einen leeren Datenrahmen zurück, nicht das in der Frage angeforderte Ergebnis. Wir möchten nicht mit dem Index übereinstimmen. Wir wollen dies
Werte an alle Zeilen von sendendf
.Hier ist eine Möglichkeit:
df.join(pd.DataFrame(s).T).fillna(method='ffill')
Um aufzuschlüsseln, was hier passiert ...
pd.DataFrame(s).T
Erstellt einen einzeiligen DataFrame,s
der folgendermaßen aussieht:s1 s2 0 5 6
Als nächstes wird
join
dieser neue Frame verkettet mitdf
:a b s1 s2 0 1 3 5 6 1 2 4 NaN NaN
Zuletzt werden die
NaN
Werte bei Index 1 mit den vorherigen Werten in der Spalte gefüllt, indemfillna
dasffill
Argument forward-fill ( ) verwendet wird:a b s1 s2 0 1 3 5 6 1 2 4 5 6
Um die Verwendung zu vermeiden
fillna
, könnenpd.concat
die Zeilen des DataFrame, aus dem erstellt wurde, wiederholt werdens
. In diesem Fall lautet die allgemeine Lösung:df.join(pd.concat([pd.DataFrame(s).T] * len(df), ignore_index=True))
Hier ist eine weitere Lösung, um die in der bearbeiteten Frage gestellte Indizierungsherausforderung zu lösen:
df.join(pd.DataFrame(s.repeat(len(df)).values.reshape((len(df), -1), order='F'), columns=s.index, index=df.index))
s
wird in einen DataFrame umgewandelt, indem die Werte wiederholt und umgeformt werden (unter Angabe der Fortran-Reihenfolge) und die entsprechenden Spaltennamen und der Index übergeben werden. Dieser neue DataFrame wird dann mit verbundendf
.quelle
NaN
Werten vermeidet .index=[3, 5]
, enthalten die neuen Spalten nach Ihrem Befehl Nans.2
sein solltelen(df)
allgemein anwendbar sein.Wenn ich vorschlagen könnte, Ihre Datenrahmen wie folgt einzurichten (automatische Indizierung):
df = pd.DataFrame({'a':[np.nan, 1, 2], 'b':[4, 5, 6]})
dann können Sie Ihre s1- und s2-Werte folgendermaßen einrichten (mit shape (), um die Anzahl der Zeilen von df zurückzugeben):
s = pd.DataFrame({'s1':[5]*df.shape[0], 's2':[6]*df.shape[0]})
dann ist das gewünschte Ergebnis einfach:
display (df.merge(s, left_index=True, right_index=True))
Alternativ können Sie einfach die neuen Werte zu Ihrem Datenrahmen hinzufügen. Df:
df = pd.DataFrame({'a':[nan, 1, 2], 'b':[4, 5, 6]}) df['s1']=5 df['s2']=6 display(df)
Beide kehren zurück:
a b s1 s2 0 NaN 4 5 6 1 1.0 5 5 6 2 2.0 6 5 6
Wenn Sie eine andere Datenliste haben (anstatt nur einen einzigen anzuwendenden Wert) und wissen, dass diese in derselben Reihenfolge wie df liegt, z.
s1=['a','b','c']
dann können Sie dies auf die gleiche Weise anhängen:
df['s1']=s1
kehrt zurück:
a b s1 0 NaN 4 a 1 1.0 5 b 2 2.0 6 c
quelle
Sie können eine pandas.DataFrame-Spalte einfach auf eine Konstante setzen. Diese Konstante kann ein int sein, wie in Ihrem Beispiel. Wenn die von Ihnen angegebene Spalte nicht in der df enthalten ist, erstellen Pandas eine neue Spalte mit dem von Ihnen angegebenen Namen. Nachdem Ihr Datenrahmen erstellt wurde (aus Ihrer Frage):
df = pd.DataFrame({'a':[np.nan, 2, 3], 'b':[4, 5, 6]}, index=[3, 5, 6])
Sie können einfach ausführen:
df['s1'], df['s2'] = 5, 6
Sie können eine Schleife oder ein Verständnis schreiben, um dies für alle Elemente in einer Liste von Tupeln oder Schlüssel und Werte in einem Wörterbuch zu tun, je nachdem, wie Sie Ihre realen Daten gespeichert haben.
quelle
Wenn
df
einpandas.DataFrame
danndf['new_col']= Series list_object of length len(df)
wird die oder die Serie list_object als Spalte mit dem Namen hinzufügen'new_col'
.df['new_col']= scalar
(wie 5 oder 6 in Ihrem Fall) funktioniert auch und ist gleichbedeutend mitdf['new_col']= [scalar]*len(df)
Ein zweizeiliger Code erfüllt also den Zweck:
df = pd.DataFrame({'a':[1, 2], 'b':[3, 4]}) s = pd.Series({'s1':5, 's2':6}) for x in s.index: df[x] = s[x] Output: a b s1 s2 0 1 3 5 6 1 2 4 5 6
quelle