J'ai 2 dataframes comme ci-dessous
J'ai besoin de Calculez la commission moyenne pondérée de chaque ville, avec une condition. P> Tout d'abord, je vais donner la sortie souhaitée et expliquer la méthodologie. P> La sortie souhaitée est ci-dessous. p> méthodologie de calcul p> Si dans une colonne de ville Par exemple, dans J'espère que mon explication est claire. P > Ceci peut être facilement effectué dans Je ne sais pas comment démarrer le processus de calcul. Par conséquent, donnez-moi s'il vous plaît un coup de pied commence à résoudre ceci. P> enseignant_commission_df code> comme ci-dessous p> étudiants_df code> comme ci-dessous. (NOTE Aucun étudiant pour maths code> dans Harare code> et Norton code>) p> [Harare, redcliff, Norton] code>, si les étudiants de tout sujet [Science, Anglais, Maths, Musique] Code> est zéro alors que ce particulier Sujet code> 's enseignant_commission code> doit être supprimé dans le poids. P> étudiants_df code>: prenez la ville harare code> colonne de science code> sujet. Étant donné que maths code> est zéro code> dans harare code>, le enseignant_commission code> sera calculé comme suit. 15 * [0,10 / (0.415 - 0.09)] = 4.62 Code> Notez le 0.09 CODE> Retrait dans le dénominateur du total. où comme dans radcliff code> il est calculé sans retrait comme 18 * [0.125 / 0.515] = 4.37 code> p> Microsoft Excel code> à l'aide d'un si code> condition. Mais je cherche une solution de pandas évolutive. P>
3 Réponses :
Donc, ce dont vous avez besoin est l'index de la ligne / de la colonne de chaque valeur null vide dans le Dataframe? P>
Vous pouvez utiliser Numpy.Où (). En fonction du type de données de votre objet NULL, vous pourriez P>
Remplacez Nan avec NULL ou "" Selon votre DTYPE P>
Ceci est similaire à ce que vous feriez dans Excel en utilisant un si p>
Personnellement, je voudrais simplement faire une copie Dataframe binaire I.e Mettez un 1 partout où il existe une valeur non nulle dans le Dataframe et 0 à NULL Emplacement, puis il suffit de miltiplez les deux vecteurs. Mais c'est probablement plus de traitement aérien p>
Merci et avancé. Basé sur votre suggestion, j'ai réussi à résoudre ce problème purement à partir de numpy code>. N'hésitez pas à donner des suggestions pour améliorer mon code. Merci.!
basé sur la suggestion donnée par utilisateur: AAAK code>. J'ai réussi à résoudre ce problème purement à partir de numpy code>. # Load data and fill N/A values
Teacher_Commission_df = pd.read_excel('data_Teacher.xlsx',index_col='Subject', skipfooter=1)
Students_df = pd.read_excel('data_Studenst.xlsx',index_col='Subject')
Students_df.fillna(value=0, inplace= True)
# Convert Dataframes to Numpy Arrays
T = Teacher_Commission_df.to_numpy(dtype='float')
S = Students_df.to_numpy(dtype='float')
# Filter index of ZERO values from Students Numpy Array and
# replace the correponding Values in teachers Numpy Array
T[np.where(S == 0)] = 0
# creat a temporary Sum numpy array for calculation
Total_Teacher = T.sum(axis=0)
#calculate incentives
Calculations = T * (S/Total_Teacher)
incentives = (pd.DataFrame(Calculations, columns=Students_df.columns, index=Students_df.index)
.round(decimals=2)
.reset_index())
incentives
Il s'agit en réalité de deux lignes de code à l'aide de Pandas: p> résultat (avec la nouvelle explication du code ci-dessus h3>
enseignant_commission_df code> en utilisant Indexation booléenne et non opérateur ( ~ code>). Li>
ul>
DF_TMP CODE>: LI>
ul>
Apply () CODE> et np.nansum code> : li>
ul>
dataframe.div () code> : li>
ul>
NAN code> avec des zéros avec Dataframe.Refrna () : Li>
ul>
Semble élégant. Mais, ne pas avoir la réponse requise. Voir le résultat requis mentionné dans ma question.
Ah! Droite, dans la dernière réponse, j'ai eu une erreur de copie-coller! :) Corrigée! Maintenant, la réponse est identique au résultat requis (à l'excl place des erreurs de rond-point, car les exemples de données sont données uniquement avec une précision de 2 chiffres).
Oui. votre code est correct. Mais, je me demande pourquoi l'arrondissement, lorsque j'ai donné les données à 3 chiffres de précision?
Les données d'origine ont été données en 2 chiffres de précision (à l'époque où j'ai copié les données pour créer l'exemple). J'ai maintenant mis à jour les valeurs finales avec les données de saisie de précision à 3 chiffres.
Pouvez-vous expliquer comment vous obtenez 41,5% et 51,5%?
Total de chaque colonne de
enseignant_commission_df code>. C'est en faitpourcentage code> .Pour facilité d'explication que j'ai mentionné% code> dans la méthodologie de calculcode>. Je l'ai déjà résolu. renvoyer ma propre réponse ci-dessous