2
votes

Créer un format matriciel à partir de python

J'ai les données suivantes dans mon dataframe B:

wow=pd.crosstab(B.F1, 
            B.F2, 
            values=B.Count, 
            aggfunc='sum',
            ).rename_axis(None).rename_axis(None, axis=1)

Je veux en faire une matrice carrée pour que les résultats soient:

    A    B   C  U
A   0    0   6  0
B   0    0   2  6
C   6    2   0  0
U   0    6   0  0

J'ai initialement utilisé pd.crosstab() mais certaines variables de F1 / F2 sont manquantes dans la matrice.

AC = 5 CA = 1 donc la sortie doit être 6.

De plus, pdcrosstab () ne reconnaît pas BU = UB , etc.

Quelqu'un qui pourrait aider? Je suis fondamentalement nouveau sur python.

Btw, c'est mon code:

F1     F2    Count
A      C      5
B      C      2
B      U      6
C      A      1


0 commentaires

3 Réponses :


2
votes

Vous pouvez pd.concat , wow et wow.T puis groupby index et sum nouveau:

>>> wow=pd.crosstab(B.F1, 
            B.F2, 
            values=B.Count, 
            aggfunc='sum',
            ).rename_axis(None).rename_axis(None, axis=1)
>>> wow
     A    C    U
A  NaN  5.0  NaN
B  NaN  2.0  6.0
C  1.0  NaN  NaN

>>> pd.concat([wow, wow.T], sort=True).fillna(0, downcast='infer').groupby(level=0).sum()
   A  B  C  U
A  0  0  6  0
B  0  0  2  6
C  6  2  0  0
U  0  6  0  0


1 commentaires

L'ajout de cette dernière ligne à mon code initial a fonctionné! Merci!



1
votes

Vous pouvez ajouter le DataFrame où 'F1' et 'F2' sont échangés avec le DataFrame d'origine.

   A  B  C  U
A  0  0  6  0
B  0  0  2  6
C  6  2  0  0
U  0  6  0  0

Ensuite, vous pouvez utiliser pivot_table :

del df1.columns.name, df1.index.name

ou crosstab :

pd.crosstab(df1.F1, df1.F2, df1.Count, aggfunc='sum').fillna(0)

Enfin, supprimez les colonnes et les noms d'index:

pd.pivot_table(df1, values='Count', index='F1', columns='F2', aggfunc='sum', fill_value=0)

Résultat:

df1 = df.append(df.rename({'F1': 'F2', 'F2': 'F1'}, axis=1), sort=False)


0 commentaires

1
votes

Vous pouvez rendre les colonnes F1 et F2 catégoriques et utiliser un crosstab pour le travail.

FDtype = pd.CategoricalDtype(list("ABCU"))

df[["F1", "F2"]] = df[["F1", "F2"]].astype(FDtype)
count = pd.crosstab(df["F1"], df["F2"], df["Count"], aggfunc='sum', dropna=False)
count.fillna(0, inplace=True, downcast="infer")
count += count.T

Remarque: il est plus efficace de spécifier les dtypes de colonne pendant la construction du DataFrame


0 commentaires