web-dev-qa-db-fra.com

combinaisons uniques de valeurs dans les colonnes sélectionnées dans le cadre de données et le nombre de pandas

J'ai mes données dans le cadre de données pandas comme suit:

df1 = pd.DataFrame({'A':['yes','yes','yes','yes','no','no','yes','yes','yes','no'],
                   'B':['yes','no','no','no','yes','yes','no','yes','yes','no']})

Donc, mes données ressemble à ceci

----------------------------
index         A        B
0           yes      yes
1           yes       no
2           yes       no
3           yes       no
4            no      yes
5            no      yes
6           yes       no
7           yes      yes
8           yes      yes
9            no       no
-----------------------------

Je voudrais le transformer en un autre cadre de données. La sortie attendue peut être affichée dans le script python suivant:

output = pd.DataFrame({'A':['no','no','yes','yes'],'B':['no','yes','no','yes'],'count':[1,2,4,3]})

Donc, ma sortie attendue ressemble à ceci

--------------------------------------------
index      A       B       count
--------------------------------------------
0         no       no        1
1         no      yes        2
2        yes       no        4
3        yes      yes        3
--------------------------------------------

En fait, je peux arriver à trouver toutes les combinaisons et les compter en utilisant la commande suivante: mytable = df1.groupby(['A','B']).size()

Cependant, il s'avère que ces combinaisons sont dans une seule colonne. J'aimerais séparer chaque valeur d'une combinaison dans une colonne différente et ajouter une colonne supplémentaire pour le résultat du comptage. Est-il possible de faire ça? Puis-je avoir vos suggestions? Merci d'avance.

Vous pouvez groupby sur les colonnes 'A' et 'B' et appeler size, puis reset_index et rename la colonne générée:

In [26]:

df1.groupby(['A','B']).size().reset_index().rename(columns={0:'count'})
Out[26]:
     A    B  count
0   no   no      1
1   no  yes      2
2  yes   no      4
3  yes  yes      3

mettre à jour

Une petite explication, en regroupant sur les 2 colonnes, celle-ci regroupe les lignes où les valeurs A et B sont identiques, on appelle size qui renvoie le nombre de groupes uniques:

In[202]:
df1.groupby(['A','B']).size()

Out[202]: 
A    B  
no   no     1
     yes    2
yes  no     4
     yes    3
dtype: int64

Alors maintenant, pour restaurer les colonnes groupées, nous appelons reset_index:

In[203]:
df1.groupby(['A','B']).size().reset_index()

Out[203]: 
     A    B  0
0   no   no  1
1   no  yes  2
2  yes   no  4
3  yes  yes  3

Cela restaure les index mais l’agrégation de taille est transformée en une colonne générée 0, nous devons donc renommer ceci:

In[204]:
df1.groupby(['A','B']).size().reset_index().rename(columns={0:'count'})

Out[204]: 
     A    B  count
0   no   no      1
1   no  yes      2
2  yes   no      4
3  yes  yes      3

groupby accepte le paramètre arg as_index que nous aurions pu définir à False. Les colonnes groupées ne sont donc pas indexées, mais ceci génère une variable series et vous devez toujours restaurer les index, etc.:

In[205]:
df1.groupby(['A','B'], as_index=False).size()

Out[205]: 
A    B  
no   no     1
     yes    2
yes  no     4
     yes    3
dtype: int64
60
EdChum

Légèrement lié, je cherchais des combinaisons uniques et je suis arrivé à cette méthode:

def unique_columns(df,columns):

    result = pd.Series(index = df.index)

    groups = meta_data_csv.groupby(by = columns)
    for name,group in groups:
       is_unique = len(group) == 1
       result.loc[group.index] = is_unique

    assert not result.isnull().any()

    return result

Et si vous voulez seulement affirmer que toutes les combinaisons sont uniques:

df1.set_index(['A','B']).index.is_unique
0