Je m'excuse à l'avance si cela a été couvert, je n'ai rien trouvé de tel. C'est mon premier travail de programmation (j'étais auparavant QA logiciel) et je me suis cogné la tête contre un mur à ce sujet.

J'ai 2 dataframes, un est très grand [df2] (14,6 millions de lignes) et je l'itère par morceaux. J'ai essayé de comparer une colonne du même nom dans chaque trame de données, si elles sont égales, je voudrais sortir une colonne secondaire du cadre plus grand.

C'est à dire.

if df1['tag'] == df2['tag']:
   df1['new column'] = df2['plate']

J'ai tenté une fusion mais cela n'a pas donné ce que j'attendais.

df3 = pd.merge(df1, df2, on='tag', how='left')

J'espère avoir fait un travail correct pour expliquer cela.

[Edit:] Je crois aussi que je devrais mentionner que df2 et df1 ont tous deux de nombreuses colonnes supplémentaires avec lesquelles je ne veux pas interagir / changer. Est-il possible de comparer uniquement les colonnes uniques de deux trames de données et de produire la troisième colonne supplémentaire?

1
seclusion 17 avril 2018 à 22:37

3 réponses

Meilleure réponse

Vous pouvez essayer la fusion inner. Tout d'abord, vous pouvez inner merge df1 avec df2 puis vous obtiendrez plates uniquement pour les lignes communes et vous pouvez renommer une nouvelle colonne df1's selon vos besoins

df1 = df1.merge(df2, on="tag", how = 'inner')

df1['new column'] = df1['plate']
del df1['plate']

J'espère que cela fonctionne.

1
DJK 17 avril 2018 à 20:09

Comme smci l'a mentionné, c'est le moment idéal pour utiliser la jointure / fusion. Si vous cherchez à préserver df1, une jointure gauche est ce que vous voulez. Vous étiez donc sur la bonne voie:

df1 = pd.merge(df1['tag'],
               df2['tag', 'plate'],
               on='tag', how='left')
df1.rename({'plate': 'new column'}, axis='columns')

Cela ne fera que comparer les colonnes tag dans chaque trame de données, donc les autres colonnes n'auront pas d'importance. Il récupérera la colonne plate de df2, puis la renommera comme vous voulez que votre nouvelle colonne soit nommée.

0
RCA 17 avril 2018 à 20:06

C'est totalement le cas pour join/merge. Vous voulez mettre df2 à gauche car il est plus petit.

df2.join(df1, on='tag', ...)

Vous avez uniquement mal compris le type de jointure / fusion) que vous souhaitez effectuer :

comment: {«gauche», «droite», «extérieur», «intérieur»}, par défaut: «gauche»

'how' = 'left' join créerait une entrée (indésirable) pour toutes les lignes du LHS df2. Ce n'est pas tout à fait ce que vous voulez (si df2 contenait d'autres valeurs de balises non vues dans df1, vous obtiendriez également des entrées pour elles).

'how' = 'inner' formerait l'intersection de df2 et df1 sur le champ 'on' = 'tag'. c'est-à-dire que vous n'obtenez que des entrées pour lesquelles df1 contient une valeur de balise valide selon df2.

Donc:

df3 = df2.join(df1, on='tag', how='inner')
# then reference df3['plate']

Ou si vous ne voulez que la colonne 'plaque' dans df3 (ou une autre sélection de colonnes), vous pouvez directement faire:

df2.join(df1, on='tag', how='inner') ['plate']
0
smci 17 avril 2018 à 22:38