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)
#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
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. ..