différence pour les pandas
Un simple pandas question:
Est-il un drop_duplicates()
de la fonctionnalité drop chaque ligne impliqués dans la reproduction?
Un équivalent question est la suivante: est-ce pandas ont une différence pour dataframes?
Par exemple:
In [5]: df1 = pd.DataFrame({'col1':[1,2,3], 'col2':[2,3,4]})
In [6]: df2 = pd.DataFrame({'col1':[4,2,5], 'col2':[6,3,5]})
In [7]: df1
Out[7]:
col1 col2
0 1 2
1 2 3
2 3 4
In [8]: df2
Out[8]:
col1 col2
0 4 6
1 2 3
2 5 5
alors peut-être quelque chose comme df2.set_diff(df1)
produira ce:
col1 col2
0 4 6
2 5 5
Cependant, je ne veux pas compter sur les indices car dans mon cas, je dois traiter avec dataframes qui ont des indices.
En passant, j'ai d'abord pensé à une extension de la drop_duplicates()
méthode, mais maintenant je me rends compte que la seconde approche utilisant les propriétés de la théorie des ensembles serait beaucoup plus utile en général. Les deux approches pour résoudre mon problème actuel, cependant.
Merci!
- oui, il est drop_duplicates méthode... voir la documentation pandas.pydata.org. Selon la façon dont les données sont structurées, vous devriez être en mesure de faire ensemble des opérations de trop. peut certainement remplacer des éléments dans l'image avec des éléments à partir d'une autre image. Pas sûr désinvolte si il est possible de vérifier l'unicité sur toutes les colonnes
- Pouvez-vous montrer comment effectuer des opérations définies?
- Pouvez-vous fournir un échantillon de données et dites-nous ce que vous essayez d'accomplir?
- Assurez-vous. Je vais mettre à jour en quelques minutes.
- s'il y a des doublons... qui dataframe a l'exacte ones. C'est à dire que vous voulez simplement pour trouver des pièces uniques ou avez-vous besoin de fusionner avec de la logique supplémentaire?
- Si il n'y a pas de doublons, différence renvoie le premier dataframe (par exemple df2.set_diff(df1) renvoie df2)
Vous devez vous connecter pour publier un commentaire.
Peu compliqué, mais si vous voulez ignorer totalement les données d'index. Convertir le contenu de la dataframes à des ensembles de tuples contenant les colonnes:
Cette étape permettra de se débarrasser de tous les doublons dans la dataframes ainsi (indice ignoré)
pouvez alors utiliser des méthodes établies pour trouver quoi que ce soit. Par exemple, pour trouver les différences:
donne:
ensemble([(1, 2), (3, 4)])
peut prendre ce retour à dataframe si nécessaire. Note transformer ensemble de la liste des 1er jeu ne peut pas être utilisé pour construire dataframe:
Voici une autre réponse qui maintient l'index et ne nécessite pas des indices identiques dans les deux trames de données.
Il est rapide et le résultat est
Appliquer par les colonnes de l'objet que vous souhaitez mapper (df2); rechercher les lignes qui ne sont pas dans le jeu (
isin
est comme un opérateur)Même chose, mais toutes les valeurs en df1, mais encore par colonne dans df2
2ème exemple
Remarque, dans 0.13, il y aura une
isin
opérateur sur le niveau des cadres, donc quelque chose comme:df2.isin(df1)
devrait être possibleg = pd.DataFrame({'x': [1.2,1.5,1.3], 'y': [4,4,4]})
et que vous souhaitez supprimerg.ix[[0,2]]
, alors ce ne sera pas sélectionner les lignes correctes car il vérifie si chaque élément de g dans g.ix[[0,2]]. La deuxième ligne comprend un certain nombre (4) qui est égal à un.g.ix[[0,2]] (en fait, deux d'entre eux sont égaux).g.set_diff(df1)
(ou l'inverse)Obtenir les indices de l'intersection avec la fusion, puis déposez-les:
Il y a 3 méthodes de travail, mais deux d'entre eux ont des défauts.
Méthode 1 (méthode de Hachage):
Il a travaillé pour tous les cas que j'ai testé.
Méthode 2 (Dict méthode):
Il échoue si DataFrames contiennent des colonnes datetime.
La méthode 3 (MultiIndex méthode):
J'ai rencontré des cas où il a échoué sur des colonnes avec Aucun ou NaN du.
Hypothèse:
Je ne suis pas sûr de savoir comment
pd.concat()
implicitement rejoint le chevauchement des colonnes, mais j'ai dû faire un peu de tweak sur @radream de réponse.Sur le plan conceptuel, un ensemble de différence (symétrique) sur plusieurs colonnes est un ensemble de l'union (outer join) moins un ensemble d'intersection (ou jointure interne (inner join):
Cela donne:
Pandas MultiIndex objets ont rapidement mis les opérations mises en œuvre que les méthodes, de sorte que vous pouvez convertir le DataFrames à MultiIndexes, utilisez le
difference()
méthode, puis convertir le résultat en arrière à un DataFrame. Cette solution devrait être beaucoup plus rapide (par ~100 fois ou plus à partir de mon test) que les solutions données ici jusqu'à présent, et il ne dépendra pas de la ligne d'indexation des images d'origine. Comme Piotr mentionné pour sa réponse, ceci ne fonctionnera pas avec les valeurs null, depuis np.nan != np.nan. Toute ligne de df2 avec une valeur null apparaissent toujours dans la différence. Aussi, les colonnes doivent être dans le même ordre pour les deux DataFrames.cela devrait fonctionner même si vous avez plusieurs colonnes dans les deux dataframes. Mais assurez-vous que les noms de colonne à la fois de la dataframes sont exactement les mêmes.
Avec plusieurs colonnes, vous pouvez également utiliser: