2017-10-11 6 views
-2

Nouveau sur Python! Je simple dataframe pour mécanographiques scores quiz:while boucle qui s'arrête à la moyenne prédéterminée

df = pd.DataFrame({'Sam':[20,20,20,20,20], 'Jim': [20,20,20,20,15], 
'Stacy': [20,20,20,20,30], 'Leslie': [20,20,20,20,20], 'Jonathan': 
[20,20,20,20,15]}) 

Maintenant, je veux écrire quelque chose qui change la valeur en haut de chaque colonne (à partir de 0) jusqu'à ce qu'il soit correspondant la valeur moyenne est égale à quelque chose prédéterminé, puis se déplace à la colonne suivante. Il était assez facile d'ajouter une nouvelle rangée et de le faire à la main jusqu'à ce que j'obtienne les résultats que je voulais (voir ci-dessous). Cependant, je cherche quelque chose qui fait que le programme fasse l'itération que j'avais à faire dans le champ iloc afin d'obtenir les valeurs 'mean2' qui étaient prédéterminées. J'imagine que cela nécessiterait une boucle de quelque sorte mais ne peut pas comprendre la syntaxe. Capture d'écran du résultat final souhaité sous le code. Je vous remercie!

df.loc['mean1'] = df.mean() 
df.iloc[0:1,0:5] = 17, 17, 22, 22, 22 
df.loc['mean2'] = df.iloc[:5,:].mean() 
df 

Capture d'écran de la structure de données finale souhaitée.

Répondre

0

-moi si je me trompe, mais si je reformule votre problème:
Qu'est-ce que vous voulez est de trouver pour chaque particiant (colonne) la valeur du premier score du quiz (df.loc [0]) qui sera s'assurer qu'un participant obtient un score cible moyen (mean2)?

Si c'est le cas, vous pouvez faire quelque chose comme:

# a function that estimate the quiz value to have for obtaining mean score target 
def estimate_replace(quiz_id, mean_target, participant_series): 
    data = participant_series.loc[participant_series.index != quiz_id].values 
    participant_series['mean1'] = participant_series.mean() 
    participant_series['mean2'] = mean_target 

    # Here is the key function! 
    participant_series.loc[quiz_id] = mean_target*(len(data)+1) - data.sum() 
    return participant_series 

#mean2 : mean scores target per participant 
mean_score_target = {'Jim':18.4, 
        'Jonathan':18.4, 
        'Leslie':20.4, 
        'Sam':20.4, 
        'Stacy':22.4} 

#the quiz id to replace, 0 in your case 
quiz_id = 0 

df = df.apply(lambda x: estimate_replace(quiz_id,mean_score_target[x.name],x)) 

Notez que ce code fonctionne avec un certain nombre de valeurs quiz (lignes) et que vous pouvez spécifier la valeur de test pour estimer/remplacer (quiz_id).

Vous obtenez alors sortie suivante:

 Jim  Jonathan Leslie Sam Stacy 
0  17.0  17.0 22.0 22.0 22.0 
1  20.0  20.0 20.0 20.0 20.0 
2  20.0  20.0 20.0 20.0 20.0 
3  20.0  20.0 20.0 20.0 20.0 
4  15.0  15.0 20.0 20.0 30.0 
mean1 19.0  19.0 20.0 20.0 22.0 
mean2 18.4  18.4 20.4 20.4 22.4 
+0

vous êtes les bienvenus! –