web-dev-qa-db-de.com

Kombinieren von zwei Serien zu einem DataFrame in pandas

Ich habe zwei Serien s1 und s2 mit denselben (nicht aufeinander folgenden) Indizes. Wie kombiniere ich s1 und s2 zu zwei Spalten in einem DataFrame und behalte einen der Indizes als dritte Spalte?

228
user7289

Ich denke concat ist ein guter Weg, dies zu tun. Wenn sie vorhanden sind, werden die Namensattribute der Reihe als Spalten verwendet (andernfalls werden sie einfach nummeriert):

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: Dies gilt für mehr als 2 Serien.

346
Andy Hayden

Pandas richten diese in Reihe übergebenen automatisch aus und erstellen den gemeinsamen Index. Sie sind hier zufällig gleich. 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
31
Jeff

Warum verwenden Sie nicht einfach .to_frame, wenn beide dieselben Indizes haben?

> = v0.23

a.to_frame().join(b)

<v0.23

a.to_frame().join(b.to_frame())
24
swmfg

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})

Mit Pandas können Sie ein DataFrame aus einem dict mit Series als Werten und den Spaltennamen als Schlüsseln erstellen. Wenn ein Series als Wert gefunden wird, wird der Series -Index als Teil des DataFrame -Index verwendet. Diese Datenausrichtung ist einer der Hauptvorteile von Pandas. Sofern Sie keine anderen Anforderungen haben, hat das neu erstellte DataFrame daher einen doppelten Wert. Im obigen Beispiel hat data['idx_col'] dieselben Daten wie data.index.

13
jbn

Ich bin mir nicht sicher, ob ich Ihre Frage vollständig verstehe, aber ist es das, was Sie tun möchten?

pd.DataFrame(data=dict(s1=s1, s2=s2), index=s1.index)

(index=s1.index ist hier nicht einmal nötig)

5
Bertrand L

Wenn ich das beantworten darf.

Die Grundlagen für die Konvertierung von Serien in Datenrahmen bestehen darin, dies zu verstehen

1. Auf konzeptioneller Ebene ist jede Spalte im Datenrahmen eine Reihe.

2. Und jeder Spaltenname ist ein Schlüsselname, der einer Reihe zugeordnet ist.

Wenn Sie mehr als zwei Konzepte berücksichtigen, gibt es viele Möglichkeiten, Serien in Datenrahmen zu konvertieren. Eine einfache Lösung wird so aussehen:

Erstellen Sie hier zwei Serien

import pandas as pd

series_1 = pd.Series(list(range(10)))

series_2 = pd.Series(list(range(20,30)))

Erstellen Sie einen leeren Datenrahmen mit den gewünschten Spaltennamen

df = pd.DataFrame(columns = ['Column_name#1', 'Column_name#1'])

Setzen Sie den Serienwert mithilfe des Mapping-Konzepts in den Datenrahmen

df['Column_name#1'] = series_1

df['Column_name#2'] = series_2

Überprüfen Sie jetzt die Ergebnisse

df.head(5)
5
Sateesh

Eine Vereinfachung der Lösung basierend auf join():

df = a.to_frame().join(b)
3