Ajouter une colonne au cadre de données pandas

104

C'est probablement facile, mais j'ai les données suivantes:

Dans le bloc de données 1:

index dat1
0     9
1     5

Dans la trame de données 2:

index dat2
0     7
1     6

Je veux un bloc de données avec la forme suivante:

index dat1  dat2
0     9     7
1     5     6

J'ai essayé d'utiliser la appendméthode, mais j'obtiens une jointure croisée (c'est-à-dire un produit cartésien).

Quelle est la bonne façon de procéder?

BenDundee
la source
2
Avez-vous essayé la joinméthode?
BrenBarn
1
data_frame_1 ['dat2'] = data_frame_2 ['dat2']
lowtech
@lowtech: cela garantit-il que les indices sont correctement appariés?
BenDundee
@BenDundee: oui c'est le cas
lowtech

Réponses:

132

Il semble en général que vous recherchez simplement une jointure:

> dat1 = pd.DataFrame({'dat1': [9,5]})
> dat2 = pd.DataFrame({'dat2': [7,6]})
> dat1.join(dat2)
   dat1  dat2
0     9     7
1     5     6
U2EF1
la source
45
Ou pd.concat([dat1, dat2], axis=1)dans ce cas.
DSM
2
@BenDundee Join et concat utilisent une grande partie du même code sous le capot, donc la "bonne" façon n'a probablement d'importance que lorsque vous considérez les cas extrêmes. Par exemple ici, si les deux DataFrames avaient une colonne «data», la jointure échouerait , alors qu'un concat vous donnerait deux colonnes nommées «data».
U2EF1
@ U2EF1: Je parlais de votre réponse par rapport à la mienne. Il y a toujours N façons d'écorcher un chat :)
BenDundee
@BenDundee je vois. Cette méthode élimine l'index unique et a des effets secondaires encore plus étranges dans des cas plus compliqués. Par exemple, si j'avais deux colonnes nommées «données», le regroupement / la somme commencerait à additionner les différentes colonnes de données, ce qui n'est certainement pas ce que vous voulez. Les données de chaîne seraient concaténées.
U2EF1
1
Comme indiqué par @ jeremy-z, il est très important de réinitialiser les index dans les deux ensembles de données s'ils ne partagent pas le même index. Sinon, vous obtiendrez un ensemble de données avec beaucoup de lignes NaNs.
Israel Varea
57

Vous pouvez aussi utiliser:

dat1 = pd.concat([dat1, dat2], axis=1)
Ella Cohen
la source
1
En cas de rencontre InvalidIndexError: Reindexing only valid with uniquely valued Index objects , vous pouvez utiliser:pd.concat([dat1.reset_index(), dat2], axis=1)
Beyondfloatingpoint
40

Les deux join()et la concat()manière pourraient résoudre le problème. Cependant, il y a un avertissement que je dois mentionner: Réinitialisez l'index avant vous join()ou concat()si vous essayez de traiter un bloc de données en sélectionnant des lignes d'un autre DataFrame.

Un exemple ci-dessous montre un comportement intéressant de join et 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
Jeremy Z
la source
Bien dit et bon point. J'ai essayé sans réinitialiser l'index et j'ai généré beaucoup de NULLS
Anand
Sans faire l'étape de réinitialisation, mes données semblaient bonnes et bonnes, mais évidemment, quelque chose ne fonctionnait pas bien dans les coulisses. Merci de l'avoir signalé! La réinitialisation a permis à mon modèle de fonctionner!
Ionuț Ciuta
Cela devrait être la réponse acceptée! Il génère toujours des NaN si nous ne réinitialisons pas l'index.
Srivatsan
Cette étape m'a sauvé. J'essayais de comprendre pourquoi concat et join lancaient beaucoup de NaN. Merci d'avoir partagé ça.
Gustavo Rottgering le
0

En fait:

data_joined = dat1.join(dat2)
print(data_joined)
Raj Stha
la source
-3

Juste une question de la bonne recherche Google:

data = dat_1.append(dat_2)
data = data.groupby(data.index).sum()
BenDundee
la source