2 votes

Compter les combinaisons uniques indépendamment de l'ordre des colonnes

J'ai deux colonnes de catégories, avec les mêmes options possibles dans les deux colonnes, et je cherche à compter le nombre de lignes par combinaison unique, indépendamment de l'ordre des catégories dans chaque ligne (colonne A ou colonne B).

Exemple de cadre de données :

df1 = pd.DataFrame({'A':['dog','cat','mouse','bunny','cat','mouse','dog'],
                   'B':['cat','dog','dog','mouse','bunny','bunny','cat']})

Ce qui ressemblerait à :

----------------------------
index         A        B
0           dog       cat
1           cat       dog
2           mouse     dog
3           bunny     mouse
4           cat       bunny
5           mouse     bunny
6           dog       cat
-----------------------------

Et j'aimerais que le résultat ressemble à ça :

--------------------------------------
index         A        B        count
0           dog       cat       3
1           bunny     mouse     2
2           mouse     dog       1
3           cat       bunny     1
--------------------------------------

Je peux obtenir le nombre de combinaisons où chien/chat est compté séparément de chat/chien, mais j'ai du mal à trouver comment obtenir le nombre de combinaisons indépendamment de la première catégorie.

1voto

Andrej Kesely Points 20452

Une autre solution, utilisant .groupby :

x = (
    df1.groupby(df1.apply(lambda x: tuple(sorted(x)), axis=1))
    .agg(A=("A", "first"), B=("B", "first"), count=("B", "size"))
    .reset_index(drop=True)
)
print(x)

Imprimés :

       A      B  count
0    cat  bunny      1
1  bunny  mouse      2
2    dog    cat      3
3  mouse    dog      1

0voto

Henry Ecker Points 15100

Essayez np.sort sur l'axe=1 pour obtenir toutes les valeurs dans les mêmes colonnes, puis utilisez valeur_comptes comme d'habitude :

import numpy as np
import pandas as pd

df1 = pd.DataFrame(
    {'A': ['dog', 'cat', 'mouse', 'bunny', 'cat', 'mouse', 'dog'],
     'B': ['cat', 'dog', 'dog', 'mouse', 'bunny', 'bunny', 'cat']})

df2 = pd.DataFrame(np.sort(df1.values, axis=1), columns=df1.columns) \
    .value_counts().reset_index(name='counts')

print(df2)

df2 :

       A      B  counts
0    cat    dog       3
1  bunny  mouse       2
2  bunny    cat       1
3    dog  mouse       1

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X