2
votes

Supprimer les lignes en double mais conserver certaines valeurs Pandas

J'ai 2 dataframes similaires que j'ai concaténées qui ont beaucoup de valeurs répétées car il s'agit essentiellement du même ensemble de données mais pour des années différentes.

Le problème est que l'un des ensembles a des valeurs manquantes alors que l'autre parfois a ces valeurs.

Par exemple:

Name        Unit       Year      Level
Nik         1          2000      12
John        2          2001      11
Stacy       1          1999      8
.
.

Je souhaite supprimer les doublons sur le subset = ['Name', 'Unit', 'Level'] car certaines répétitions n'ont pas d'années.

Cependant, il me reste les données qui n'ont pas de Year et j'aimerais conserver les données avec ces valeurs:

Name        Unit       Year      Level
Nik         1          2000      12
Nik         1                    12
John        2          2001      11
John        2          2001      11
Stacy       1                    8
Stacy       1          1999      8
.
.

Comment puis-je conserver ces valeurs plutôt que les blancs?


0 commentaires

3 Réponses :


2
votes

Utilisez sort_values ​​ avec le paramètre par défaut na_position = 'last' , donc doit être omis, puis drop_duplicates :

df = df.groupby(subset, as_index=False, sort=False)['Year'].first()
print (df)
    Name  Unit  Level    Year
0    Nik     1     12  2000.0
1   John     2     11  2001.0
2  Stacy     1      8  1999.0

Ou:

print (df)
    Name  Unit    Year  Level
5  Stacy     1  1999.0      8
1    Nik     1  2000.0     12
2   John     2  2001.0     11


0 commentaires

0
votes

Une solution qui me vient à l'esprit est de commencer par trier le dataframe concaténé par année avec la fonction sortvalues: https://pandas.pydata.org/pandas- docs / stable / generated / pandas.DataFrame.sort_values.html puis supprimez les doublons avec le paramètre keep = 'first'

df.drop_duplicates(subset=['Name', 'Unit', 'Level'], keep="first")


0 commentaires

0
votes

Je vous suggère de regarder l'étape de création de votre ensemble de données fusionné.

Lors de la fusion des ensembles de données, vous pouvez le faire sur plusieurs indices, c'est-à-dire

import pandas as pd
import numpy as np


left = pd.DataFrame({'Name': ['Adam', 'Beatrice', 'Crissy', 'Dumbo', 'Peter', 'Adam'],
                     'Unit': ['2', '4', '6', '2', '4', '12'],
                     'Year': ['', '2009', '1954', '2025', '2012', '2024'],
                     'Level': ['L1', 'L1', 'L0', 'L4', 'L3', 'L10']})

right = pd.DataFrame({'Name': ['Adam', 'Beatrice', 'Crissy', 'Dumbo'],
                     'Unit': ['2', '4', '6', '2'],
                     'Year': ['2010', '2009', '1954', '2025'],
                     'Level': ['L1', 'L1', 'L0', 'L4']})

df = pd.merge(left, right, how='outer', on=['Name', 'Unit', 'Level'],  suffixes=['', '_r'])
df['Year'] = df[['Year', 'Year_r']].apply(lambda x: x['Year'] if (x['Year'] is not np.nan and x['Year'] != '') else x['Year_r'], axis=1)
df

Avec la jointure externe, vous collectez tous les ensembles de données et supprimez immédiatement les doublons. La seule chose qui reste est de fusionner la colonne Year, ce que vous pouvez faire comme ceci:

df['Year'] = df[['Year', 'Year_r']].apply(lambda x: x['Year'] if (x['Year'] is not np.nan and x['Year'] != '') else x['Year_r'], axis=1)

Cela comble les lacunes et ensuite vous pouvez simplement supprimer la colonne "Year_r".

L'avantage ici est que non seulement les valeurs NaN des années manquantes sont couvertes, mais aussi les années manquantes qui sont représentées sous forme de chaînes vides.

En suivant un petit exemple fonctionnel:

XXX


0 commentaires