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.
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
Je pense que vous voulez effectuer une outer
merge
:
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