Fügen Sie eine Spalte an den Pandas-Datenrahmen an


103

Das ist wahrscheinlich einfach, aber ich habe die folgenden Daten:

In Datenrahmen 1:

index dat1
0     9
1     5

In Datenrahmen 2:

index dat2
0     7
1     6

Ich möchte einen Datenrahmen mit der folgenden Form:

index dat1  dat2
0     9     7
1     5     6

Ich habe versucht, die appendMethode zu verwenden, aber ich bekomme einen Cross-Join (dh ein kartesisches Produkt).

Was ist der richtige Weg, um dies zu tun?


2
Hast du die joinMethode ausprobiert ?
BrenBarn

1
data_frame_1 ['dat2'] = data_frame_2 ['dat2']
Lowtech

@lowtech: Stellt das sicher, dass die Indizes richtig gepaart sind?
BenDundee

@ BenDundee: Ja, das tut es
Lowtech

Antworten:


129

Im Allgemeinen suchen Sie nur nach einem Join:

> dat1 = pd.DataFrame({'dat1': [9,5]})
> dat2 = pd.DataFrame({'dat2': [7,6]})
> dat1.join(dat2)
   dat1  dat2
0     9     7
1     5     6

45
Oder pd.concat([dat1, dat2], axis=1)in diesem Fall.
DSM

2
@BenDundee Join und Concat verwenden viel denselben Code unter der Haube, sodass der "richtige" Weg wahrscheinlich nur dann von Bedeutung ist, wenn Sie Randfälle berücksichtigen. Wenn zum Beispiel beide DataFrames eine 'Daten'-Spalte hätten , würde der Join fehlschlagen , während ein Concat Ihnen zwei Spalten mit dem Namen' Daten 'geben würde.
U2EF1

@ U2EF1: Ich habe über deine Antwort gegen meine gesprochen. Es gibt immer N Möglichkeiten, eine Katze zu häuten :)
BenDundee

@ BenDundee Ich verstehe. Diese Methode verwirft den eindeutigen Index und hat in komplizierteren Fällen jedoch noch seltsamere Nebenwirkungen. Wenn ich zum Beispiel zwei Spalten mit dem Namen "Daten" hätte, würde das Gruppieren / Summieren die verschiedenen Datenspalten summieren, was mit ziemlicher Sicherheit nicht das ist, was Sie wollen. String-Daten würden verkettet.
U2EF1

1
Wie von @ jeremy-z gezeigt, ist es sehr wichtig, die Indizes in beiden Datensätzen zurückzusetzen, wenn sie nicht denselben Index verwenden. Andernfalls erhalten Sie einen Datensatz mit vielen NaN-Zeilen.
Israel Varea

57

Sie können auch verwenden:

dat1 = pd.concat([dat1, dat2], axis=1)

1
Falls Sie auf etwas stoßen InvalidIndexError: Reindexing only valid with uniquely valued Index objects , können Sie pd.concat([dat1.reset_index(), dat2], axis=1)
Folgendes

39

Beides join()und concat()Weg könnten das Problem lösen. Es gibt jedoch eine Warnung, die ich erwähnen muss: Setzen Sie den Index vor Ihnen zurück join()oder concat()wenn Sie versuchen, mit einem Datenrahmen umzugehen, indem Sie einige Zeilen aus einem anderen Datenrahmen auswählen.

Ein Beispiel unten zeigt ein interessantes Verhalten von Join und Concat:

dat1 = pd.DataFrame({'dat1': range(4)})
dat2 = pd.DataFrame({'dat2': range(4,8)})
dat1.index = [1,3,5,7]
dat2.index = [2,4,6,8]

# way1 join 2 DataFrames
print(dat1.join(dat2))
# output
   dat1  dat2
1     0   NaN
3     1   NaN
5     2   NaN
7     3   NaN

# way2 concat 2 DataFrames
print(pd.concat([dat1,dat2],axis=1))
#output
   dat1  dat2
1   0.0   NaN
2   NaN   4.0
3   1.0   NaN
4   NaN   5.0
5   2.0   NaN
6   NaN   6.0
7   3.0   NaN
8   NaN   7.0

#reset index 
dat1 = dat1.reset_index(drop=True)
dat2 = dat2.reset_index(drop=True)
#both 2 ways to get the same result

print(dat1.join(dat2))
   dat1  dat2
0     0     4
1     1     5
2     2     6
3     3     7


print(pd.concat([dat1,dat2],axis=1))
   dat1  dat2
0     0     4
1     1     5
2     2     6
3     3     7

Gut gesagt und guter Punkt. Ich habe versucht, ohne den Index zurückzusetzen, und eine ganze Menge NULLS
Anand

Ohne den Reset-Schritt zu machen, sahen meine Daten gut aus, aber hinter den Kulissen funktionierte offensichtlich etwas nicht gut. Vielen Dank für den Hinweis! Der Reset hat mein Modell zum Laufen gebracht!
Ionuț Ciuta

Dies sollte die akzeptierte Antwort sein! Es werden immer NaNs generiert, wenn der Index nicht zurückgesetzt wird.
Srivatsan

Dieser Schritt hat mich gerettet. Ich habe versucht zu verstehen, warum Concat und Join eine Menge NaNs werfen. Vielen Dank für das Teilen.
Gustavo Rottgering

0

Nur in der Tat:

data_joined = dat1.join(dat2)
print(data_joined)

-3

Nur eine Frage der richtigen Google-Suche:

data = dat_1.append(dat_2)
data = data.groupby(data.index).sum()
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.