0
votes

Comment économiser la sortie d'une boucle tandis que la boucle dans A pour la boucle de Python?

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 Ajoutez , aucune ne fonctionnait.

voici Mes données : xxx

ici est mon code : xxx

Il renvoie une liste booléenne, nommément: FAUXFALSEFALSETUEFALSEFALSEFALSEFALSEFALEFALSEFALSEURUTERUEFALEFALSEFALSEFALEFALSÉTÉRUÉTÉTÉRUÉTUÉTUTUREE

: Comment puis-je enregistrer cette sortie de boucle dans une liste?


5 commentaires

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 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 . J'estime toujours que ma question (en gras) a été claire indiquée. Je vais m'améliorer la prochaine fois :) Cordialement


Je cherche juste quelque chose comme df.groupby ('id') ["argent"]. Diff (). GT (0) Pas besoin de boucles imbriquées


Prenez 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.


4 Réponses :


1
votes

Essayez ceci xxx

sortie: xxx


0 commentaires

1
votes

Si je comprends votre question correctement, il vous suffit de définir la variable en dehors du pour boucle: xxx

au moment où vous réinitialisez la valeur À chaque fois, de sorte que vous ne finissez plus que la sortie du dernier identifiant .


0 commentaires

1
votes
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.

0 commentaires

2
votes

IIUC Utilisez Groupby < / Code> , diff , FILLNA et ne : xxx

[out] xxx


5 commentaires

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 pour une petite différence de moins de 5, mais false sans différence). Vous pouvez alors nan ces valeurs dehors et utiliser série.ffill (remplissage en avant) pour propager les valeurs précurseurs en avant