0
votes

La fonction de chute des pandas sur des doublons est la suppression de lignes non valides

est la fonction de chute incorrecte? Besoin d'une guidage d'experts sur la manière de résoudre ce problème:

  • Les lignes pour une certaine date peuvent apparaître dans plusieurs fichiers
  • i Supprimer les lignes avec Duplicate Date, Time à partir de CS ...
  • ... puis comparez une colonne ( VAL2 ), seulement conservant les lignes où la première ligne du VAL2 est la plus élevée

    code: xxx


    échantillon de données: xxx

    Sortie attendue: xxx

    sortie réelle: xxx


9 commentaires

Si vous avez des numériques avec le nom de fichier, cela devrait fonctionner: df [df.file.eq (df.groupby («date») ['fichier »]. Transform (' Max '))]


Comme @Michcio dit, vous vous trouvez à tout moment en construisant manuellement un fichier de données avec quelque chose comme cs [cs.dupliqué (...)] , c'est une odeur de code que vous devriez utiliser groupeby () < / code>. Et ensuite le sort_values ​​ sur le contenu du groupe peut être effectué avec un agrégat comme .agg ({'val': 'max'})


Il y a 274 Pandas QUESTIONS sur les doublons , c'est sûrement une duplication, dont?


Connexes: Pandas: Drop DUPLICATES en GroupeBy 'Date'


Votre question se résume à: "Débutant des doublons exacts de ['date'," temps "] colonnes, comme Ceci ; puis faire un composé groupeby ([" date ', "heure"]) ; résumée / agrégat par max valeur sur VAL2 colonne "*


Bonjour à tous, merci pour les commentaires. Le jeu de données d'une date peut apparaître dans 2 fichiers et il suffit d'utiliser uniquement à partir de fichier1 ou de fichier2. Comment savoir dans quel fichier à extraire est basé sur la colonne VAL2 de la première ligne de la date dans les deux fichiers. Si le VAL2 de la première ligne de date X de File1 est supérieur à VAL2 de la première rangée de la même date X de File2, j'utiliserai alors un jeu de données de date X dans File1. Et vice versa. Je vais essayer de mettre à jour mes exemples de données.


@ anky_91, SMCI, je pense que mon cas est un peu différent, je ne peux pas utiliser le groupeby. Mais je peux me tromper cependant. S'il vous plaît éclairer moi. Merci.


@spx actuellement votre question n'est toujours pas claire. Par exemple. "Garder les lignes où la première rangée de VAL2 est la plus élevée" n'a pas beaucoup de sens. Je pense que je sais ce que vous essayez d'atteindre, mais j'aimerais être sûr. Veuillez éditer votre question. Essayez de ne pas suggérer la solution (car c'est ce que nous recherchons), mais plutôt formuler le problème sans ambiguïté.


@ MICHCIO1234 En fait, je traiterais des données sur les contrats à terme (comme des actions / stocks). Les contrats à terme peuvent avoir plusieurs périodes de contrat. Dis qu'il y a des périodes juin / juillet / août / etc. Je veux juste "récolter" des données avec les plus transactées. Si juin va expirer, son volume (VAL2 dans mes données d'échantillons) diminuera et le volume de juillet sera supérieur à celui des juin. Au lieu de vérifier manuellement ou du code carré de la date, j'utilise le script pour extraire uniquement la journée avec le plus grand volume (peut généralement dire à l'heure d'ouverture => La première ligne de volume est la plus élevée entre juin et juillet). J'espère que cela clarifie. Merci.


3 Réponses :


2
votes

Réponse modifiée:

Après discussion dans les commentaires, je pense que c'est ce dont vous avez besoin (j'ai ajouté du code pour reproduire le problème): xxx

Le résultat est : xxx

Cela fait une initiation: un groupe de groupe dans une groupeby.

Groupes de groupe externe par date parce que celles-ci sont les groupes que nous voulons rechercher le Fichier in.

INTER GROUPECH effectue des recherches pour le fichier correct dans un groupe et ne conserve que les lignes de ce fichier. <<


Réponse originale:

de construire un fichier de données avec des doublons et itération à travers elle, vous pouvez simplement utiliser groupy : xxx

Il regroupe toutes les lignes qui ont les mêmes valeurs dans Date de date et TIME COLONNES, puis, pour chaque groupe, il ne laisse que la ligne avec la valeur la plus élevée de VAL2 Le résultat est le suivant: xxx


1 commentaires

Salut @ michcio1234, merci pour le conseil. Mais je pense que je ne peux pas utiliser groupby. J'ai mis à jour mes exemples de données ci-dessus. Je pense que j'ai besoin d'utiliser itérant. Mais je ne suis pas expert, aucun conseil portable est très apprécié.



1
votes

Pour supprimer les rangées que vous voulez:

  • avec des valeurs répétées de date em> et heure em>, li>
  • Garder la dernière ligne de l'ensemble répété, Li> ul>

    Utilisation: p>

    cs.sort_index(inplace=True)
    


1 commentaires

Bonjour @valdi_bo, merci pour le conseil. Mais je pense que cela ne donnera pas de résultat attendu. J'ai mis à jour mon exemple d'échantillon / données ci-dessus. Désolé si je ne l'ai pas fourni clairement plus tôt.



0
votes

Les lignes "invalides" ont été supprimées en raison de l'index. Après le PD.ConCat, il faut réinitialiser l'index à l'aide de Cs.Reset_index (surplacez-le = true, goutte = true). Sans l'index de réinitialisation, l'index démarre de 0 pour chaque fichier. Et il a été supprimé par la fonction de chute car certaines des valeurs d'index ont été répétées.

Bien que je puisse obtenir le résultat correct, toujours la colonne de filtrage par date ne fonctionne pas (cs.drop (cs [(CS.DATE). = DP.Values ​​[0] [0])). Si cela fonctionne, je n'avais pas à "réinitialiser" l'index. Ou, est-ce que je l'ai utilisé à tort? P>

Merci tout pour votre aide. Si vous avez un moyen meilleur et élégant d'obtenir la production attendue, cela serait apprécié. P>

Cordialement Cordialement. P>

cs = pd.concat([pd.read_csv(f) for f in fnames])
cs.reset_index(inplace=True,drop=True)
dp = cs[cs.duplicated(['date','time'],keep=False)]
dp = dp.sort_values(['date','time'],ascending=True)

while len(dp)>0:
    if dp.values[0][3] > dp.values[1][3]:
        if dp.index[0] > dp.index[1]:
            cs.drop(cs[(cs.date==dp.values[0][0]) & (cs.index < dp.index[0])].index, inplace=True)
            dp.drop(dp[(dp.date==dp.values[0][0])].index, inplace=True)


0 commentaires