J'ai une combinaison de boucle pour vérifier les différences de valeur pour les observations d'une année-personne. L'ensemble des choses me donne une liste booléenne en tant que résultat dont j'ai besoin d'une analyse plus approfondie.
J'ai essayé plusieurs versions de voici ici est mon code strong>: p> Il renvoie une liste booléenne, nommément:
FAUXFALSEFALSETUEFALSEFALSEFALSEFALSEFALEFALSEFALSEURUTERUEFALEFALSEFALSEFALEFALSÉTÉRUÉTÉTÉRUÉTUÉTUTUREE P> STRUT>: Comment puis-je enregistrer cette sortie de boucle dans une liste? P> P> Ajoutez code>, aucune ne fonctionnait. P>
4 Réponses :
Essayez ceci sortie: p>
Si je comprends votre question correctement, il vous suffit de définir la variable en dehors du au moment où vous réinitialisez la valeur À chaque fois, de sorte que vous ne finissez plus que la sortie du dernier identifiant pour code> boucle: code>. p> p>
from collections import defaultdict
result = defaultdict(list)
for i in df.id.unique():
# find the first and last index value
first = df[df['id']==i].index.values.astype(int)[0]
last = df[df['id']==i].index.values.astype(int)[-1]
# first element has to be kept
print(False)
result.append("False")
# my try: diff = []
# for all elements, compare values next to each other
while first < last:
abs_diff = abs( df['money'][first] - df['money'][first+1] ) > 0
# print TRUE, when adjacent values differ
print(abs_diff)
result[i].append(abs_diff)
# my try: diff.append(abs_diff)
# update the counter
first +=1
I guess it will work if you want to save id for each person individually.
IIUC Utilisez [out] p> Groupby < / Code> , diff code> , FILLNA code> et ne code> :
Merci beaucoup d'améliorer le code en général. Je vais le tester pour plusieurs versions avec mes données. Parfois, les identifiants / valeurs sont des missions, etc.
Voici la preuve de ce que j'essaie de vous apporter @marcodoe
@Erfan j'ai également posté tout le problème. Puisque je n'ai aucune réponse, j'ai commencé à construire du code. J'ai trouvé que les questions liées au code sont répondues plus rapides et plus étendues que les descriptions de problèmes. Encore une fois, je lisai maintenant via le XY-problème. Merci pour les commentaires
Chris, comment puis-je régler votre code pour vérifier la première fois si la différence est vraiment petite (disons 5) et si cela attribue sa valeur de précurseur (c'est-à-dire lisser les données)?
Pour vérifier la différence moins de 5, vous pouvez faire quelque chose comme df.groupby ('id') ["argent"]. Diff (). Fillna (0) .abs (). entre (1, 5) < / Code> (Ce sera vrai code> pour une petite différence de moins de 5, mais false code> sans différence). Vous pouvez alors nan code> ces valeurs dehors et utiliser série.ffill code> (remplissage en avant) pour propager les valeurs précurseurs en avant
Qu'est-ce qui ne va pas avec juste à l'annexe d'une liste ou avez-vous voulu que chaque personne ait sa propre liste d'abs_diff?
C'est un cas typique d'un XY Problème . Prenez un pas en arrière et décrivez ce que vous voulez faire, pas pourquoi votre solution B> ne fonctionne pas. Il est fort probable qu'une solution plus facile et vectorisée disponible. Essayez d'ajouter une sortie attendue.
@Erfan merci pour vos commentaires. La question formulaire a demandé aux utilisateurs de non seulement indiquer la question, mais aussi «Fournir des antécédents, y compris ce que vous avez déjà essayé». J'ai essayé
append code>. J'estime toujours que ma question (en gras) a été claire indiquée. Je vais m'améliorer la prochaine fois :) CordialementJe cherche juste quelque chose comme
df.groupby ('id') ["argent"]. Diff (). GT (0) Code> Pas besoin de boucles imbriquéesPrenez 30 secondes pour lire le lien que j'ai fourni. Étape 1 Vous avez corrigé, vous avez fourni des données d'exemple. Deuxièmement: Décrivez ce que vous voulez réaliser avec la sortie attendue comme des données. Vous avez maintenant collé votre code comme description problématique. Comme vous pouvez le constater, votre problème est probablement une doublure comme @chrisa sa suggestion.