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
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