Ich habe zwei Serie s1
und s2
mit den gleichen (nicht aufeinander folgenden) Indizes. Wie kombiniere ich s1
und s2
zu zwei Spalten in einem DataFrame und einen der Indizes als dritte Spalte?Kombinieren von zwei Serie in einem Datenrahmen in Pandas
Antwort
Ich denke, concat
ist eine nette Möglichkeit, dies zu tun. Wenn sie vorhanden sind, verwendet er die Namen Attribute der Serie wie die Spalten (sonst ist es einfach Zahlen sie):
In [1]: s1 = pd.Series([1, 2], index=['A', 'B'], name='s1')
In [2]: s2 = pd.Series([3, 4], index=['A', 'B'], name='s2')
In [3]: pd.concat([s1, s2], axis=1)
Out[3]:
s1 s2
A 1 3
B 2 4
In [4]: pd.concat([s1, s2], axis=1).reset_index()
Out[4]:
index s1 s2
0 A 1 3
1 B 2 4
Hinweis: Diese erstreckt sich auf mehr als 2 Serie.
Beispielcode:
a = pd.Series([1,2,3,4], index=[7,2,8,9])
b = pd.Series([5,6,7,8], index=[7,2,8,9])
data = pd.DataFrame({'a': a,'b':b, 'idx_col':a.index})
Pandas können Sie eine DataFrame
von einem dict
mit Series
als die Werte und die Spaltennamen als Schlüssel erstellen. Wenn es einen Series
als Wert findet, verwendet es den Series
Index als Teil des DataFrame
Index. Diese Datenausrichtung ist einer der Hauptvorteile von Pandas. Folglich, wenn Sie andere Bedürfnisse haben, hat der frisch erstellte DataFrame
doppelten Wert. Im obigen Beispiel hat data['idx_col']
die gleichen Daten wie data.index
.
Nicht sicher, ich verstehe Ihre Frage vollständig, aber ist das, was Sie tun möchten?
pd.DataFrame(data=dict(s1=s1, s2=s2), index=s1.index)
(index=s1.index
ist nicht einmal hier notwendig)
Pandas den gemeinsamen Index Sie geschehen sein, das gleiche hier automatisch ausrichten in Serie diese weitergegeben und erstellen. reset_index
verschiebt den Index in eine Spalte.
In [2]: s1 = Series(randn(5),index=[1,2,4,5,6])
In [4]: s2 = Series(randn(5),index=[1,2,4,5,6])
In [8]: DataFrame(dict(s1 = s1, s2 = s2)).reset_index()
Out[8]:
index s1 s2
0 1 -0.176143 0.128635
1 2 -1.286470 0.908497
2 4 -0.995881 0.528050
3 5 0.402241 0.458870
4 6 0.380457 0.072251
Warum verwenden Sie einfach .to_frame, wenn beide die gleichen Indizes haben? Diese
a.to_frame().join(b.to_frame())
^^ funktioniert nicht, wenn versucht zu 'verbinden' zwei Pandas serieses
Vielleicht wäre das passender: a.to_frame (name = 'a'). Join (b.to_frame (name = 'b')) – user3282777
eine Vereinfachung der Lösung auf Basis von join()
:
df = a.to_frame().join(b)
das Kopieren tatsächlich vermeidet auch (im Vergleich zur dict Lösung) – Jeff
In einer Instanz scheint es mir zu sagen 'ValueError: Der Wahrheitswert eines Arrays mit mehr als einem Element ist mehrdeutig. Benutze a.any() oder a.all() '- irgendwelche Ideen? – user7289
@ user7289 nicht sicher, wo das herkommen würde, könntest du das als eine andere Frage stellen? –