web-dev-qa-db-fra.com

les pandas fusionnent la base de données avec NaN (ou "inconnu") pour les valeurs manquantes

J'ai 2 dataframes, dont l'une contient des informations supplémentaires pour certaines (mais pas toutes) des lignes de l'autre.

names = df({'names':['bob','frank','james','tim','ricardo','mike','mark','joan','joe'],
            'position':['dev','dev','dev','sys','sys','sys','sup','sup','sup']})
info = df({'names':['joe','mark','tim','frank'],
           'classification':['thief','thief','good','thief']})

Je voudrais prendre la colonne de classification du info dataframe ci-dessus et l'ajouter au names dataframe ci-dessus. Cependant, lorsque je fais combined = pd.merge(names, info), la trame de données résultante ne compte que 4 lignes. Toutes les lignes qui n'ont pas d'informations supplémentaires sont supprimées.

Idéalement, les valeurs de ces colonnes manquantes seraient définies sur unknown. Il en résulte une trame de données où certaines personnes sont leurs personnes, certaines sont bonnes et le reste sont inconnues.

EDIT: L’une des premières réponses que j’ai reçues suggérait d’utiliser la fusion, qui semble faire des choses étranges. Voici un exemple de code:

names = df({'names':['bob','frank','bob','bob','bob''james','tim','ricardo','mike','mark','joan','joe'],
            'position':['dev','dev','dev','dev','dev','dev''sys','sys','sys','sup','sup','sup']})
info = df({'names':['joe','mark','tim','frank','joe','bill'],
           'classification':['thief','thief','good','thief','good','thief']})
what = pd.merge(names, info, how="outer")
what.fillna("unknown")

La chose étrange est que dans la sortie, je vais avoir une ligne où le nom résultant est "bobjames" et une autre où position est "devsys". Enfin, même si facture n'apparaît pas dans la base de données de noms, il apparaît dans la base de données résultante. J'ai donc vraiment besoin d'un moyen de dire que rechercher une valeur dans cet autre cadre de données et si vous trouvez quelque chose de flou sur ces colonnes.

26
Kevin Thompson

Si vous cherchez toujours une réponse à cela:

Les "étranges" choses que vous avez décrites sont dues à des erreurs mineures dans votre code. Par exemple, la première (apparition de "bobjames" et "devsys") est due au fait que vous n'avez pas de virgule entre ces deux valeurs dans vos cadres de données source. Et la deuxième raison est que les pandas ne se soucient pas du nom de votre cadre de données mais se soucient du nom de vos colonnes lors de la fusion (vous avez un cadre de données appelé "noms" mais vos colonnes sont également appelées "noms"). Sinon, il semble que la fusion fasse exactement ce que vous recherchez:

import pandas as pd
names = pd.DataFrame({'names':['bob','frank','bob','bob','bob', 'james','tim','ricardo','mike','mark','joan','joe'], 
                      'position':['dev','dev','dev','dev','dev','dev', 'sys','sys','sys','sup','sup','sup']})

info = pd.DataFrame({'names':['joe','mark','tim','frank','joe','bill'],
                     'classification':['thief','thief','good','thief','good','thief']})
what = pd.merge(names, info, how="outer")
what.fillna('unknown', inplace=True)

qui se traduira par:

      names position classification
0       bob      dev        unknown
1       bob      dev        unknown
2       bob      dev        unknown
3       bob      dev        unknown
4     frank      dev          thief
5     james      dev        unknown
6       tim      sys           good
7   ricardo      sys        unknown
8      mike      sys        unknown
9      mark      sup          thief
10     joan      sup        unknown
11      joe      sup          thief
12      joe      sup           good
13     bill  unknown          thief
14
oxtay

Je pense que vous voulez effectuer une outermerge :

In [60]:

pd.merge(names, info, how='outer')
Out[60]:
     names position classification
0      bob      dev            NaN
1    frank      dev          thief
2    james      dev            NaN
3      tim      sys           good
4  ricardo      sys            NaN
5     mike      sys            NaN
6     mark      sup          thief
7     joan      sup            NaN
8      joe      sup          thief

Il y a une section montrant le type de fusions que peut effectuer: http://pandas.pydata.org/pandas-docs/stable/merging.html#database-style-stata-jataing-moining

14
EdChum