Kombinieren von zwei Serien zu einem DataFrame in Pandas

277

Ich habe zwei Serien s1und s2mit den gleichen (nicht aufeinander folgenden) Indizes. Wie kann ich kombinieren s1und s2zwei Spalten in einem Datenrahmen und halten als dritte Säule einer der Indizes zu sein?

user7289
quelle

Antworten:

415

Ich denke, das concatist ein guter Weg, dies zu tun. Wenn sie vorhanden sind, werden die Namensattribute der Serie 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 erstreckt sich auf mehr als 2 Serien.

Andy Hayden
quelle
5
Dies vermeidet tatsächlich auch das Kopieren (im Vergleich zur Diktatlösung)
Jeff
In einem Fall scheint es mir zu sagen: 'ValueError: Der Wahrheitswert eines Arrays mit mehr als einem Element ist nicht eindeutig. Verwenden Sie a.any () oder a.all () '- irgendwelche Ideen?
user7289
@ user7289 nicht sicher, woher das kommen würde, könnten Sie dies als eine andere Frage stellen?
Andy Hayden
@AndyHayden: Was ist, wenn entlang eines oder beider Indizes Duplikate vorhanden sind?
Mannaggia
2
@dafinguzman Was "diese Funktion ständig wiederverwenden" bedeutet, ist, dass Sie es vorziehen sollten, das Concat einmal zu machen, pd.concat([list_of_dataframes]) anstatt es viele Male new_df = pd.DataFrame(); for df in list_of_dsf: new_df = pd.concat([new_df, df])oder ähnliches zu konzertieren .
Andy Hayden
38

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())
swmfg
quelle
4
Vielleicht wäre dies angemessener: a.to_frame (name = 'a'). Join (b.to_frame (name = 'b'))
user3282777
33

Pandas werden diese übergebenen automatisch in Reihe ausrichten und den gemeinsamen Index erstellen. Sie sind hier zufällig gleich. reset_indexverschiebt 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
Jeff
quelle
16

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 DataFrameaus einem dictmit Seriesals Werte und den Spaltennamen als Schlüssel erstellen . Wenn a Seriesals Wert gefunden wird, wird der SeriesIndex als Teil des DataFrameIndex verwendet. Diese Datenausrichtung ist einer der Hauptvorteile von Pandas. Folglich hat der frisch erstellte DataFrameWert , sofern Sie keine anderen Anforderungen haben, einen doppelten Wert. Im obigen Beispiel data['idx_col']hat die gleichen Daten wie data.index.

jbn
quelle
13

Wenn ich das beantworten darf.

Die Grundlagen für die Konvertierung von Serien in Datenrahmen sind, 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, können Sie sich viele Möglichkeiten vorstellen, Serien in Datenrahmen zu konvertieren. Eine einfache Lösung lautet wie folgt:

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 nur den gewünschten Spaltennamen

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

Fügen Sie den Serienwert mithilfe des Mapping-Konzepts in den Datenrahmen ein

df['Column_name#1'] = series_1

df['Column_name#2'] = series_2

Überprüfen Sie jetzt die Ergebnisse

df.head(5)
Sateesh
quelle
6

Sie sind sich nicht sicher, ob ich Ihre Frage vollständig verstehe, aber möchten Sie dies tun?

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

( index=s1.indexist hier nicht mal nötig)

Bertrand L.
quelle
3

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

df = a.to_frame().join(b)
Lorenzo A. Rossi
quelle
1

Ich habe Pandas verwendet, um mein Numpy-Array oder meine Zahlen in einen Datenrahmen zu konvertieren. Dann habe ich die zusätzliche Spalte nach Schlüssel als 'Vorhersage' hinzugefügt und hinzugefügt. Wenn Sie einen Datenrahmen benötigen, der zurück in eine Liste konvertiert wurde, verwenden Sie values.tolist ()

output=pd.DataFrame(X_test)
output['prediction']=y_pred

list=output.values.tolist()     
Goldener Löwe
quelle