3
votes

Sélectionnez des lignes d'un Pandas DataFrame avec les mêmes valeurs dans une colonne mais une valeur différente dans l'autre colonne

Disons que j'ai le pandas DataFrame ci-dessous:

   A      B    C   D
1  foo    one  0   0
3  foo    two  4   8
5  bar  three  7  14
6  bar    four 7  14

Je voudrais sélectionner toutes les lignes qui ont des valeurs égales dans A mais des valeurs différentes dans B. Je voudrais donc la sortie de mon code pour être:

   A      B     C   D
1  foo    one   0   0
2  foo    one   2   4
3  foo    two   4   8
4  cat    one   8   4
5  bar    four  6  12
6  bar    three 7  14
7  bar    four  7  14

Quelle est la manière la plus efficace de faire cela? J'ai environ 11 000 lignes avec beaucoup de variation dans les valeurs de colonne, mais cette situation se présente souvent. Dans mon ensemble de données, si les éléments de la colonne A sont égaux, la valeur de la colonne B correspondante doit également être égale, mais en raison d'un mauvais étiquetage, ce n'est pas le cas et je voudrais résoudre ce problème, il ne serait pas pratique pour moi de faire celui-ci en une.


2 commentaires

Pourquoi le chat 1 manque-t-il?


cat one est manquant car il n'y a pas d'autre ligne telle que «cat» est sa valeur A mais «one» n'est pas sa valeur B. peut-être que mon message n'était pas assez clair, désolé.


3 Réponses :


2
votes

Utilisez groupby + filtre + head :

     A      B  C   D
0  foo    one  0   0
2  foo    two  4   8
4  bar   four  6  12
5  bar  three  7  14


3 commentaires

Quand j'essaye ceci, j'obtiens: type unhashable: 'dict' . Pour référence type (df) renvoie: et type (df.A) renvoie < code>


Quels sont les types de df.A?


@ apolanco115 Eh bien, je ne sais pas ce qui peut être à l'origine de l'erreur, je charge l'exemple dans votre message en tant que csv et cela fonctionne. Le dtype est également objet. Il semble qu'une de vos colonnes contient un dictionnaire?



4
votes

Vous pouvez essayer groupby () + filter + drop_duplicates():

>>> df.drop_duplicates(subset=['A', 'B'], keep="first")
     A      B  C   D
0  foo    one  0   0
2  foo    two  4   8
3  cat    one  8   4
4  bar   four  6  12
5  bar  three  7  14

OU, si vous souhaitez supprimer les doublons entre le sous-ensemble de colonnes A et B , vous pouvez utiliser ci-dessous, mais la ligne aura également cat .

>>> df.groupby('A').filter(lambda g: len(g) > 1).drop_duplicates(subset=['A', 'B'], keep="first")
     A      B  C   D
0  foo    one  0   0
2  foo    two  4   8
4  bar   four  6  12
5  bar  three  7  14


0 commentaires