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
3 Réponses :
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
L'ajout de cette dernière ligne à mon code initial a fonctionné! Merci!
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)
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