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?


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

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)

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

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)

-3

Juste une question de la bonne recherche Google:

data = dat_1.append(dat_2)
data = data.groupby(data.index).sum()
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.