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?
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.
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
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())
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
.
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)
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)
Eine Vereinfachung der Lösung basierend auf join()
:
df = a.to_frame().join(b)