La fonction pandas
drop_duplicates
est idéale pour "unifier" une trame de données. Cependant, l'un des arguments de mot clé à transmettre est take_last=True
ou take_last=False
, alors que je voudrais supprimer toutes les lignes qui sont en double dans un sous-ensemble de colonnes. Est-ce possible?
A B C
0 foo 0 A
1 foo 1 A
2 foo 1 B
3 bar 1 A
Par exemple, j'aimerais supprimer les lignes qui correspondent aux colonnes A
et C
afin que les lignes 0 et 1 soient supprimées.
C’est beaucoup plus facile dans pandas avec maintenant drop_duplicates et le paramètre keep.
import pandas as pd
df = pd.DataFrame({"A":["foo", "foo", "foo", "bar"], "B":[0,1,1,1], "C":["A","A","B","A"]})
df.drop_duplicates(subset=['A', 'C'], keep=False)
Je veux juste ajouter à la réponse de Ben sur drop_duplicates :
keep
: {‘premier’, ‘dernier’, Faux}, ‘premier’ par défaut
first: supprime les doublons sauf pour la première occurrence.
last: supprime les doublons sauf pour la dernière occurrence.
False: Supprime tous les doublons.
Réglez donc keep
sur False, nous vous donnons la réponse souhaitée.
DataFrame.drop_duplicates (* args, ** kwargs) Renvoie DataFrame avec les lignes en double supprimées, éventuellement en ne considérant que certaines colonnes.
Paramètres: subset: étiquette de colonne ou séquence d'étiquettes, facultatif Considérez uniquement certaines colonnes pour identifier les doublons. Par défaut, utilisez toutes les colonnes conservées: {'premier', 'dernier', Faux}, par défaut 'premier' en premier: Supprimer les doublons sauf pour la première fois. last: supprime les doublons sauf pour la dernière occurrence. False: Supprime tous les doublons. take_last: deprecated inplace: boolean, default False Indique s'il faut supprimer les doublons ou renvoyer une copie. cols: kwargs uniquement l'argument du sous-ensemble [deprecated] Renvoie: dédupliqué: DataFrame
Si vous souhaitez que le résultat soit stocké dans un autre jeu de données:
df.drop_duplicates(keep=False)
ou
df.drop_duplicates(keep=False, inplace=False)
Si le même jeu de données doit être mis à jour:
df.drop_duplicates(keep=False, inplace=True)
Les exemples ci-dessus vont supprimer tous les doublons et en conserver un, semblable à DISTINCT *
en SQL
utilisez groupby
et filter
import pandas as pd
df = pd.DataFrame({"A":["foo", "foo", "foo", "bar"], "B":[0,1,1,1], "C":["A","A","B","A"]})
df.groupby(["A", "C"]).filter(lambda df:df.shape[0] == 1)
En fait, seules les lignes 0 et 1 sont supprimées (toutes les observations contenant les A et C appariés sont conservées):
In [335]:
df['AC']=df.A+df.C
In [336]:
print df.drop_duplicates('C', take_last=True) #this dataset is a special case, in general, one may need to first drop_duplicates by 'c' and then by 'a'.
A B C AC
2 foo 1 B fooB
3 bar 1 A barA
[2 rows x 4 columns]
Mais je soupçonne que ce que vous voulez vraiment est ceci (une observation contenant les A et C appariés est conservée):
In [337]:
print df.drop_duplicates('AC')
A B C AC
0 foo 0 A fooA
2 foo 1 B fooB
3 bar 1 A barA
[3 rows x 4 columns]
Maintenant, c'est beaucoup plus clair, donc:
In [352]:
DG=df.groupby(['A', 'C'])
print pd.concat([DG.get_group(item) for item, value in DG.groups.items() if len(value)==1])
A B C
2 foo 1 B
3 bar 1 A
[2 rows x 3 columns]