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?
3 Réponses :
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
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")
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