[PYTHON] Utiliser l'indicateur avec pd.merge

Aperçu

Il y a un argument «indicateur» lors de la fusion avec des pandas, mais bien que ce soit très pratique, je pense que peu de gens l'utilisent, c'est donc un article dans le but de se répandre.

La Documentation indique ce qui suit.

indicator : bool or str, default False If True, adds a column to output DataFrame called “_merge” with information on the source of each row. If string, column with information on source of each row will be added to output DataFrame, and column will be named value of string. Information column is Categorical-type and takes on a value of “left_only” for observations whose merge key only appears in ‘left’ DataFrame, “right_only” for observations whose merge key only appears in ‘right’ DataFrame, and “both” if the observation’s merge key is found in both.

En règle générale, si vous rejoignez à gauche, tous les enregistrements qui n'existent que dans les données de gauche seront perdus au moment de la fusion. Cependant, lors de l'analyse des données, il arrive souvent que vous souhaitiez voir comment les enregistrements sont liés et quels enregistrements ne sont pas liés. Si vous fusionnez normalement, il sera assez difficile de vérifier cela, ou plus tard vous remarquerez que ce n'est pas du tout lié et que ce sera un désastre, mais si vous utilisez l'indicator présenté dans cet article, vous pouvez facilement le vérifier. Je vais.

Il n'y a pas de problème particulier si la cible à analyser est uniquement des données internes et que toutes les données sont complètement liées à la clé, mais cela est utile pour extraire des données inconnues de l'extérieur et les relier aux propres données de l'entreprise. Faire.

Prenons un exemple concret.

Exemple concret

Supposons que vous souhaitiez associer les données de poids b que vous avez prélevées de l'extérieur aux données de hauteur a dont vous disposez.

a = pd.DataFrame({
    "ID" : [1, 2, 3, 4, 6],
    "name": ["Tom", "Bob", "Alex", "Mike", "John"],
    "heigt": [169, 173, 163, 170, 182]
})

b = pd.DataFrame({
    "ID" : [1, 2, 3, 4, 5],
    "weight": [65, 70, 72, 58, 61]
})
a
スクリーンショット 2019-12-22 11.58.39.png
b
スクリーンショット 2019-12-22 11.58.45.png

Si vous voulez analyser sans réfléchir

c = a.merge(b, on="ID", how="left")
# or
c = a.merge(b, on="ID", how="inner")

Je pense que vous devriez le faire selon votre objectif.

Ici, b sont les données apportées de l'extérieur, nous voulons donc savoir ce qui suit.

―― Dans quelle mesure a et b sont-ils liés? --Je veux voir les détails de l'enregistrement où a (b) ne colle pas

Vous pouvez facilement vérifier cela avec l'option ʻindicator. C'est facile à utiliser, il suffit d'ajouter ʻindicator = True comme indiqué ci-dessous.

(La vérification en double de la clé de jointure n'est pas mentionnée ici)

c = a.merge(b, on="ID", how="outer", indicator=True)
c
スクリーンショット 2019-12-22 12.14.25.png

Ensuite, la colonne _merge sera ajoutée avec l'ensemble de données fusionné comme ci-dessus. La colonne «_merge» contient l'une des valeurs «both», «left_only» ou «right_only», qui vous indique d'où vient l'enregistrement. Après cela, utilisez cette colonne

c_left_only = c[c["_merge"]=="left_only"]
c_left_only
スクリーンショット 2019-12-22 12.21.01.png Ensuite, vous pouvez obtenir une liste de personnes qui sont grandes mais pas de poids.

Il est pratique de définir how = "external" lors de la fusion, puis d'extraire les données avec la valeur "_merge" en fonction de l'objectif.

De plus, ʻindicator` supporte non seulement le type bool mais aussi le type str.

d = a.merge(b, on="ID", how="outer", indicator="flg_weight")
d
スクリーンショット 2019-12-22 12.22.58.png La partie `_merge` peut être la chaîne spécifiée.

C'est une fonction pratique, alors veuillez l'utiliser! Ayons une bonne vie d'analyse des données ~~

Recommended Posts

Utiliser l'indicateur avec pd.merge
Utilisez RTX 3090 avec PyTorch
Utiliser ansible avec cygwin
Utiliser pipdeptree avec virtualenv
[Python] Utiliser JSON avec Python
Utilisez Mock avec pytest
Utiliser Gentelella avec Django
Utiliser mecab avec Python 3
Utiliser tensorboard avec Chainer
Utiliser DynamoDB avec Python
Utiliser pip avec MSYS2
Utilisez Python 3.8 avec Anaconda
Utiliser les droits d'auteur avec Spacemacs
Utiliser python avec docker
Utiliser TypeScript avec django-compresseur
Utilisez LESS avec Django
Utiliser MySQL avec Django
Utiliser Enum avec SQLAlchemy
Utiliser tensorboard avec NNabla
Utiliser le GPS avec Edison
Utilisez nim avec Jupyter
Utiliser l'API Trello avec python
Utiliser la mémoire partagée avec une bibliothèque partagée
Utiliser des graphiques directionnels avec networkx
Utiliser TensorFlow avec Intellij IDEA
Utiliser l'API Twitter avec Python
Utiliser pip avec Jupyter Notebook
Utiliser DATE_FORMAT avec le filtre SQLAlchemy
Utiliser TUN / TAP avec Python
Utilisez sqlite3 avec NAO (Pepper)
Utilisez les load_extensions de sqlite avec Pyramid
Utiliser les polices Windows 10 avec WSL
Utilisation du chainer avec Jetson TK1
Utiliser SSL avec Celery + Redis
Utiliser Cython avec Jupyter Notebook
Utilisez Maxout + CNN avec Pylearn2
Utilisez WDC-433SU2M2 avec Manjaro Linux
Utilisez OpenBLAS avec numpy, scipy
Utiliser l'API subsonique avec python3
Utilisation de Sonicwall NetExtener avec Systemd
Utilisez prefetch_related commodément avec Django
Utiliser l'interpréteur AWS avec Pycharm
Utilisation de Bokeh avec IPython Notebook
Utiliser une plage de type Python avec Rust
Utiliser MLflow avec Databricks ④ --Call model -
Python: comment utiliser async avec
Utiliser la caméra Point Grey avec Python (PyCapture2)
Utilisez vl53l0x avec RaspberryPi (python)
Utilisez PX-S1UD / PX-Q1UD avec Jetson nano
Utilisez la fonction de prévisualisation avec aws-cli
Pour utiliser virtualenv avec PowerShell
Utilisez NAIF SPICE TOOL KIT avec Python
Utiliser rospy avec virtualenv dans Python3
Utiliser Markdown avec le notebook Jupyter (avec raccourci)
Utiliser Python mis en pyenv avec NeoVim
Utilisez Tensorflow 2.1.0 avec Anaconda sur Windows 10!
Utiliser la synthèse vocale Windows 10 avec Python
Utiliser la bibliothèque curl / jq avec Go