Les pandas imbriqués groupby donnent des résultats inattendus

CookieMaster

Je travaille sur un problème où j'utilise un groupby.apply imbriqué sur un pandas DataFrame. Pendant la première application, j'ajoute une colonne que j'utilise pour le deuxième groupby.apply interne. Le résultat combiné me semble défectueux. Quelqu'un peut-il m'expliquer pourquoi les phénomènes ci-dessous se produisent et comment y remédier de manière fiable?

Voici un exemple minimal:

import numpy as np
import pandas as pd

T = np.array( [
        [1,1,1],
        [1,1,1],
        [1,2,2],
        [1,2,2],
        [2,1,3],
        [2,1,3],
        [2,2,4],
        [2,2,4],
])

df = pd.DataFrame(T, columns= ['a','b','c' ])

print(df)


def foo2(x):
    return x

def foo(x):

    print("*" * 80 )

    # Add column d and groupby/apply on column 'd'
    x['d'] = [1, 1, 2, 2]
    x = x.groupby('d').apply(foo2)

    print(x)

    print("*" * 80)
    return x


# Apply first groupby/apply on column 'a'
df = df.groupby('a').apply( foo)

print("*"*80)
print("*"*80)

print(df)

Lorsque j'exécute le code ci-dessus sur mon ordinateur portable Windows, j'obtiens le résultat attendu

     a  b  c  d
a              
1 0  1  1  1  1
  1  1  1  1  1
  2  1  2  2  2
  3  1  2  2  2
2 4  2  1  3  1
  5  2  1  3  1
  6  2  2  4  2
  7  2  2  4  2

Exécuter le même code sur un Mac donne

     a  b  c  d
a              
1 0  1  1  1  1
  1  1  1  1  1
  2  1  2  2  2
  3  1  2  2  2
2 4  1  1  3  1
  5  1  1  3  1
  6  1  2  4  2
  7  1  2  4  2

Le problème ici est que dans la colonne «a», les 4 dernières entrées sont 1 alors qu'elles devraient être 2 comme sur la machine Windows.

ÉDITER:

Version Pandas sur les deux: 0.24.2

Version Python sous Windows: 3.7.3

Version Python sur Mac: 3.7.4

kd88

[Mac, Python: 3.6.8]

Je pense que le comportement attendu des DataFrame.applys imbriqués va être un peu compliqué à déboguer. Ma recommandation est d'aller droit au but en émulant ce que vous voulez réaliser apply(c'est-à-dire cartographier puis réduire):

  1. Carte: utilisez la mapméthode native de python , suivie de
  2. Réduire: utilisez pandas.concatpour combiner les résultats
import numpy as np
import pandas as pd

def my_apply(df, f):
    return pd.concat(map(f, df))

def foo(x):
    group, grouped = x
    grouped['d'] = [1, 1, 2, 2]
    return grouped.groupby('d').apply(lambda x: x)

T = np.array([[1,1,1]]*2 + [[1,2,2]]*2 +
             [[2,1,3]]*2 + [[2,2,4]]*2)           
df = pd.DataFrame(T, columns= ['a','b','c' ])
df = my_apply(df.groupby('a'), foo)
print(df)

Résultat:

   a  b  c  d
0  1  1  1  1
1  1  1  1  1
2  1  2  2  2
3  1  2  2  2
4  2  1  3  1
5  2  1  3  1
6  2  2  4  2
7  2  2  4  2

Remarques:

  1. Je n'ai pas essayé de traiter la différence d'implémentation / d'architecture conduisant à cette différence de performance entre Mac / Windows]
  2. J'ai réduit votre exemple, remplacé foo2par un lambda, n'hésitez pas à revenir en arrière.
  3. Le code ci-dessus lancera l'avertissement suivant A value is trying to be set on a copy of a slice from a DataFrame [...]. C'est parce que nous définissons délibérément la valeur d'une copie. C'est un comportement attendu, pas un bogue. pandasCette opération interprète malheureusement cette opération comme une erreur, car elle l'est probablement normalement.

Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.

En cas d'infraction, veuillez [email protected] Supprimer.

modifier le
0

laisse moi dire quelques mots

0commentaires
connexionAprès avoir participé à la revue

Articles connexes

Les formats de chaîne paramétrés donnent des résultats inattendus

Pourquoi les attributions multiples donnent-elles ici des résultats inattendus?

Les changements de taille de police de textArea donnent des résultats inattendus

Null conditionnel et ToString ensemble donnent des résultats inattendus

Les pandas attribuent des séries aux résultats groupby

Résultats inattendus des boucles for imbriquées

pandas Explode produisant des résultats inattendus

La lecture à partir d'un seul fichier et l'écriture dans 2 fichiers séparés donnent des résultats inattendus

Interroger / filtrer par objets imbriqués obtenant des résultats inattendus dans certains objets imbriqués

Indexer les lignes et les colonnes des résultats inattendus

Les propriétés CSS float + align produisent des résultats inattendus

La boucle imbriquée OpenCL produit des résultats inattendus

Les pandas soustrayant des lignes donnent un mauvais résultat

Fusionner les DataFrames donne des résultats inattendus

pandas et sinon produit des résultats inattendus

Pandas sort_values donne des résultats inattendus

Les conditions LINQ to Entities donnent des résultats étranges

CMAKE: les appels répétés à la fonction avec des arguments différents donnent les mêmes résultats

Les constructeurs de date fournissent des résultats inattendus lorsqu'ils sont appelés avec des arguments similaires

Tracés à barres horizontales donnant des résultats inattendus

Comment obtenir les résultats imbriqués de LINQ Groupby

Python numpy: les inversions de matrice donnent des résultats imprécis lorsqu'ils sont multipliés

Pandas groupby multiindex lorsqu'ils sont uniques au premier niveau: résultats inattendus

Pandas comment calculer les résultats groupby

Tracé des résultats de Pandas GroupBy

Tracé des résultats de Pandas GroupBy

Le mappage de boundingRect () à l'élément parent et l'intersection donnent des résultats inattendus pour la gestion des collisions

Des résultats inattendus dans les discussions Java multi-malgré les verrous

Faire correspondre les résultats des appels ajax imbriqués

TOP liste

  1. 1

    Comment utiliser HttpClient avec TOUT cert ssl, quelle que soit la « mauvaise » est

  2. 2

    Comment afficher du texte au milieu de div avec une couleur d'arrière-plan différente?

  3. 3

    Résultat de l'échantillonneur JMeter : comprendre le temps de chargement, le temps de connexion et la latence

  4. 4

    Modbus Python Schneider PM5300

  5. 5

    Pourquoi Object.hashCode () ne suit pas la convention du code Java

  6. 6

    Comment faire une recherche partielle et obtenir un score pertinent dans Elasticsearch

  7. 7

    Existe-t-il un moyen de voir si mon bot est hors ligne ?

  8. 8

    Comment choisir le nombre de fragments et de répliques Elasticsearch

  9. 9

    optimiser les opérations du serveur avec elasticsearch: traitement des filigranes de disque bas

  10. 10

    Comment changer la couleur de la police dans R?

  11. 11

    Autocomplete avec java, Redis, Recherche élastique, Mongo

  12. 12

    MasterService d'ElasticSearch prend trop de temps pour calculer l'état du cluster et lancer ProcessClusterEventTimeoutException

  13. 13

    Comment vérifier si un utilisateur spécifique a un rôle? Discord js

  14. 14

    Spring @RequestParam DateTime format comme ISO 8601 Date Heure facultative

  15. 15

    Comment analyser un hachage Ruby plat en un hachage imbriqué?

  16. 16

    Comment créer une nouvelle application dans Dropbox avec des autorisations complètes

  17. 17

    Quelque chose dans le cluster Elasticsearch 7.4 devient de plus en plus lent avec les délais de lecture de temps en temps

  18. 18

    Ajustement non linéaire avec R

  19. 19

    php ajouter et fusionner des données de deux tables

  20. 20

    Exporter la table de l'arborescence vers CSV avec mise en forme

  21. 21

    帶有 Spring Boot 和 Azure AD 的 KeyCloak

chaudétiquette

Archive