Comment combiner deux trames de données?

106

J'utilise des trames de données Pandas. J'ai une trame de données initiale, disons D. J'en extrait deux trames de données comme ceci:

A = D[D.label == k]
B = D[D.label != k]

puis je change l'étiquette AetB

A.label = 1
B.label = -1

Je veux combiner A et B afin de pouvoir les avoir comme une seule trame de données, quelque chose comme une opération d'union. L'ordre des données n'est pas important. Cependant, lorsque nous échantillonnons A et B à partir de D, ils conservent leurs index de D.

MKoosej
la source

Réponses:

150

Je crois que vous pouvez utiliser la appendméthode

bigdata = data1.append(data2, ignore_index=True)

pour conserver leurs index, n'utilisez pas le ignore_indexmot - clé ...

Joran Beasley
la source
1
Cela marche. Il crée cependant un nouveau DataFrame. Existe-t-il un moyen de le faire en ligne? Ce serait bien lorsque je charge d'énormes quantités de données à partir d'une base de données par lots afin de pouvoir mettre à jour le DataFrame de manière itérative sans créer de copie à chaque fois.
Andrew
1
Oui, c'est possible, voir: stackoverflow.com/a/46661368/5717580
martin-martin
91

Vous pouvez également utiliser pd.concat, ce qui est particulièrement utile lorsque vous joignez plus de deux dataframes:

bigdata = pd.concat([data1, data2], ignore_index=True, sort=False)
ostrokach
la source
Je veux utiliser ceci, mais j'essaye de concaténer deux colonnes du même nom o_O
lifelonglearner
45

Pensé pour ajouter ceci ici au cas où quelqu'un le trouverait utile. @ostrokach a déjà mentionné comment fusionner les blocs de données entre les lignes, ce qui est

df_row_merged = pd.concat([df_a, df_b], ignore_index=True)

Pour fusionner les colonnes, vous pouvez utiliser la syntaxe suivante:

df_col_merged = pd.concat([df_a, df_b], axis=1)
pelumi
la source
14

Il existe une autre solution pour le cas où vous travaillez avec du Big Data et avez besoin de concaténer plusieurs ensembles de données. concatpeut être gourmand en performances, donc si vous ne voulez pas créer un nouveau df à chaque fois, vous pouvez à la place utiliser une compréhension de liste :

frames = [ process_file(f) for f in dataset_files ]
result = pd.append(frames)

(comme indiqué ici dans la documentation en bas de la section):

Remarque : Il convient de noter cependant que concat(et donc append) fait une copie complète des données, et que la réutilisation constante de cette fonction peut créer un impact significatif sur les performances. Si vous devez utiliser l'opération sur plusieurs ensembles de données, utilisez une compréhension de liste.

martin-martin
la source
2

Si vous souhaitez mettre à jour / remplacer les valeurs du premier dataframe df1par les valeurs du second dataframe df2. vous pouvez le faire en suivant les étapes -

Étape 1: définir l'index de la première trame de données (df1)

df1.set_index('id')

Étape 2: définir l'index de la deuxième trame de données (df2)

df2.set_index('id')

et enfin mettre à jour le dataframe à l'aide de l'extrait suivant -

df1.update(df2)
Mohsin Mahmood
la source
0

1ère dataFrame

train.shape

résultat:-

(31962, 3)

2ème dataFrame

test.shape

résultat:-

(17197, 2)

Combiner

new_data=train.append(test,ignore_index=True)

Vérifier

new_data.shape

résultat:-

(49159, 3)
Harish Kumawat
la source