[PYTHON] Je veux donner un group_id à une trame de données pandas

introduction

Si vous souhaitez supprimer les doublons avec des pandas, ou si vous souhaitez agréger, vous pouvez utiliser drop_duplicates et groupby.

Comment supprimer les éléments en double dans Pandas DataFrame ou Series Python Comment utiliser Pandas groupby

Cependant, il y a des moments où je veux donner un group_id à chaque groupe dans les mêmes conditions que lorsque groupby, mais je ne savais pas comment le faire, alors je l'ai implémenté. (Ce n'est peut-être pas la meilleure pratique, mais c'était facile à mettre en œuvre)

Accorder group_id

#importation de pandas
import pandas as pd

#Préparation de la trame de données
df = pd.DataFrame({
    'building_name': ['Construire un', 'Construire un', 'Bâtiment B', 'Bâtiment C', 'Bâtiment B', 'Bâtiment B', 'Bâtiment D'],
    'property_scale': ['large', 'large', 'small', 'small', 'small', 'small', 'large'],
    'city_code': [1, 1, 1, 2, 1, 1, 1]
})
df
building_name property_scale city_code
Construire un large 1
Construire un large 1
Bâtiment B small 1
Bâtiment C small 2
Bâtiment B small 1
Bâtiment B small 1
Bâtiment D large 1
#Objectisation de groupe
group_info = df.groupby(['property_scale', 'city_code'])
#Jetons un coup d'œil au contenu
group_info.groups

{('large', 1): Int64Index([0, 1, 6], dtype='int64'), ('small', 1): Int64Index([2, 4, 5], dtype='int64'), ('small', 2): Int64Index([3], dtype='int64')}

#Voir également
group_info.get_group(('large', 1))
building_name property_scale city_code
Construire un large 1
Construire un large 1
Bâtiment D large 1
# group_Accorder l'ID
df = pd.concat([
    group_info.get_group(group_name).assign(group_id=group_id)
    for group_id, group_name
    in enumerate(group_info.groups.keys())])
df
building_name property_scale city_code group_id
Construire un large 1 0
Construire un large 1 0
Bâtiment D large 1 0
Bâtiment B small 1 1
Bâtiment B small 1 1
Bâtiment B small 1 1
Bâtiment C small 2 2

Je vais aussi en faire une fonction

import pandas as pd
from pandas.core.frame import DataFrame

def add_group_id(df: DataFrame, by: list) -> DataFrame:
    """Regrouper les enregistrements avec des doublons par valeurs_Donnez votre identifiant.

    Args:
        df (DataFrame):Trame de données arbitraire
        by (list):Nom de colonne à regrouper

    Returns:
        DataFrame

    """
    #Déjà groupe_Si la colonne id est incluse, groupez par_Ajouter également un identifiant
    if 'group_id' in df.columns:
        by += ['group_id']
    group_info = df.groupby(by=by)
    new_df = pd.concat([
        group_info.get_group(group_name).assign(group_id=group_id)
        for group_id, group_name
        in enumerate(group_info.groups.keys())])
    return new_df

Postscript

Merci à @r_beginners pour ses commentaires, il semble que groupby ait une fonction de calcul group_id en premier lieu.

import pandas as pd
from pandas.core.frame import DataFrame

def add_group_id(df: DataFrame, by: list) -> DataFrame:
    """Regrouper les enregistrements avec des doublons par valeurs_Donnez votre identifiant.

    Args:
        df (DataFrame):Trame de données arbitraire
        by (list):Nom de colonne à regrouper

    Returns:
        DataFrame

    """
    #Déjà groupe_Si la colonne id est incluse, groupez par_Ajouter également un identifiant
    if 'group_id' in df.columns:
        by += ['group_id']
    new_df = df.assign(group_id =df.groupby(by).ngroup())
    return new_df

Comme @ nkay l'a commenté, pd.factorize () semble également fonctionner.

méthode pandas Étudions plus. ..

Recommended Posts

Je veux donner un group_id à une trame de données pandas
Je veux faire ○○ avec les Pandas
J'ai essayé de créer un cadre de données pandas en grattant les informations de rappel d'aliments avec Python
Je veux imprimer dans la notation d'inclusion
Je veux créer un environnement Python
Je veux faire de matplotlib un thème sombre
Je souhaite créer facilement un modèle de bruit
Je veux INSÉRER un DataFrame dans MSSQL
Je veux créer une fenêtre avec Python
Quoi qu'il en soit, je veux vérifier facilement les données JSON
Je veux frapper 100 sciences des données avec Colaboratory
Je veux faire un jeu avec Python
Je ne veux pas passer un test de codage
Je veux obtenir les données de League of Legends ③
Je veux obtenir les données de League of Legends ②
Je souhaite créer un type d'implémentation pouvant être branché
Transformez les données de vacances en une trame de données avec les pandas
Je veux trouver facilement une délicieuse boutique
Je veux obtenir les données de League of Legends ①
Je veux écrire dans un fichier avec Python
Je souhaite télécharger une application Django sur heroku
Je souhaite créer une application WEB en utilisant les données de League of Legends ①
Changer le bloc de données des données d'achat de pandas (produit ID X) en dictionnaire
Je souhaite intégrer une variable dans une chaîne Python
Je veux facilement implémenter le délai d'expiration en python
100 coups sur le traitement d'image !! (021-030) Je veux faire une pause ...
Je veux générer rapidement UUID (memo memo) ~ Edition Python ~
Je veux faire la transition avec un bouton sur le ballon
Je veux escalader une montagne avec l'apprentissage par renforcement
Je veux écrire en Python! (2) Écrivons un test
Je veux trouver un package populaire sur PyPi
Je veux échantillonner au hasard un fichier avec Python
Je souhaite créer facilement un environnement de développement basé sur un modèle
Je veux travailler avec un robot en python.
Je veux diviser une chaîne de caractères avec hiragana
Je souhaite installer un package de Php Redis
[Python] Je veux faire d'une liste imbriquée un taple
Je souhaite créer manuellement une légende avec matplotlib
Je souhaite envoyer automatiquement un e-mail de création d'entreprise
Je veux dire qu'il y a un prétraitement des données ~
Je veux faire fonctionner un ordinateur quantique avec Python
Je veux lier une variable locale avec lambda
Je souhaite utiliser une source de données python dans Re: Dash pour obtenir les résultats de la requête.
Je veux un générateur de mox
Je veux résoudre SUDOKU
Je veux un générateur mox (2)
Je veux pouvoir analyser des données avec Python (partie 3)
Je veux pouvoir analyser des données avec Python (partie 1)
Je veux créer un éditeur de blog avec l'administrateur de django
Je veux démarrer un environnement Jupyter avec une seule commande
[Python] Je souhaite obtenir un ensemble commun entre numpy
Je veux démarrer beaucoup de processus à partir de python
Je veux faire une macro de clic avec pyautogui (désir)
Je veux générer automatiquement un nom de groupe de metal moderne
Ingéniosité pour gérer les données avec Pandas de manière à économiser la mémoire
Je veux pouvoir analyser des données avec Python (partie 4)
Je veux pouvoir analyser des données avec Python (partie 2)
[Introduction à Pandas] J'ai essayé d'augmenter les données d'échange par interpolation de données ♬
Je veux faire une macro de clic avec pyautogui (Outlook)
Je souhaite utiliser un environnement virtuel avec jupyter notebook!