0
votes

Suppression de valeurs nulles et découpage à partir d'un tableau croisé dynamique dans Pandas

J'ai du mal à découper mon bloc de données pivoté afin d'obtenir des résultats au-dessus d'un certain seuil. J'essaie de filtrer les résultats inférieurs à une valeur minimale. Mon bloc de données ressemble à ceci:

                                                                                     Qty                                
Index   Store_Nbr   201712   201801  201802  201803  201804  201805  201806  201807  201808
0             NaN      NaN      275     293     256     313     421     493     291     385
1             NaN      147      316     343     416     361     483     438     136     461
2             NaN      266      370     162     346     451     414     296     478     295
3             NaN      NaN      179     353     241     370     247     423     391     194
4             NaN      389      480     450     102     482     137     251     153     153
...           ...     ...       ...     ...     ...     ...     ...     ...     ...     ...
30            NaN      NaN      NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN
31            NaN      NaN      NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN
32            NaN      NaN      NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN
33            NaN      NaN      311     151     488     135     239     212     104     122
34            NaN      NaN      NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN

Après avoir utilisé godzilla = godzilla [godzilla ['Qty']> 150] j'obtiens le bloc de données ci-dessous où il a été converti tous les zéro à nuls et n'a rien filtré.

                                                                                    Qty                             
Index   Store_Nbr   201712  201801  201802  201803  201804  201805  201806  201807  201808
0               1      356     275     293     256     313     421     493     291     385
1               2      147     316     343     416     361     483     438     136     461
2               3      266     370     162     346     451     414     296     478     295
3               4      322     179     353     241     370     247     423     391     194
4               5      249     389     480     450     102     482     137     251     153
...            ...     ...     ...     ...     ...     ...     ...     ...     ...     ...
30             30        0       0       0       0       0       0       0       0       0
31             31        0       0       0       0       0       0       0       0       0
32             32        0       0       0       0       0       0       0       0       0
33             33      392     311     151     488     135     239     212     104     122
34             34        0       0       0       0       0       0       0       0      -1

J'ai essayé de faire godzilla.dropna (axis = 0, inplace = True, how = 'any') qui renvoie un dataframe vide et godzilla = godzilla.dropna (subset = godzilla ['Qty']) qui renvoie une KeyError: 'Qty'. Je suis déconcerté qu'il convertisse les zéros en null et pourquoi la tranche ne fonctionne pas. Des mots de sagesse lorsque vous essayez de filtrer / découper des données pivotées?

Remarque ** Que j'ai plus de Qté pivoté dans le bloc de données.


3 commentaires

que voulez-vous faire lorsqu'une ligne n'a pas toutes les colonnes comme nulles?


Si une ligne a même une valeur nulle, je veux l'exclure.


Je pense qu'une idée de l'ensemble du pivot incluant d'autres choses que "Qty" serait utile - en fait, essayer de créer une trame de données factice et d'y appliquer des solutions, trouve souvent le problème.


3 Réponses :


0
votes

Tout d'abord, vous remplacez toute valeur inférieure à 150 par Aucune.
Ensuite, vous devez filtrer la ligne avec au moins 1 valeur None comme décrit dans cette réponse

Cela devrait faire l'affaire:

# replaces every value of the DataFrame lower than 150 with None
godzilla = pd.DataFrame([
    [x if not isinstance(x, (int, float)) or x >= 150 else None for x in j
] for j in godzilla.as_matrix()])

# replaces every value of the Column "Qty" lower than 150 with None
df["Qty"] = [x if not isinstance(x, (int, float)) or x >= 20 else None for x in df["Qty"]

#dropna will drop all rows with at least 1 null value
df = df.dropna(how='any',axis=0)


3 commentaires

Cela ne fonctionne pas. Si je pouvais faire fonctionner la tranche en premier lieu, ce serait optimal.


Récupérer cet objet 'TypeError:' method 'object is not iterable'


Qu'est-ce que tu as fait exactement?



0
votes

Oui! Vous travaillez avec une structure hiérarchique, multiindex. C'est pourquoi les colonnes ne sont pas supprimées, mais remplacées par NaN . S'il n'y a pas d'autre index que Qty , vous pouvez utiliser:

godzilla = godzilla.dropna(how='any',axis=0)

Et puis suivez-le avec dropna () : p>

godzilla.columns = godzilla.columns.droplevel()


3 commentaires

J'ai un bloc de données vide sans valeurs. @ Celius, quelle est la bonne façon de découper le dataframe hiérarchique afin que je puisse filtrer les 0 pour commencer?


Ils fonctionnent comme des tuples, donc votre index est ('Qty', 'Store_Nbr'), ('Qty', '201712'), ('Qty', '201801') et ainsi de suite ...


Cela a du sens car toutes les lignes de Store_Nbr sont nulles, c'est-à-dire qu'elles ne remplissent pas la condition. Vous devriez envisager de le laisser tomber avant d'utiliser le dropna (how = 'any', axis = 0 ')



0
votes

J'ai enfin compris. Désolé pour le retard. Appréciez les réponses que vous proposez tous. L'erreur était complètement de ma part. Plus tôt dans le code, j'avais utilisé .drop_index () car je ne savais pas à l'époque que je pouvais manipuler l'index en utilisant .index . Après avoir corrigé le code, je n'ai eu aucun problème à définir les paramètres en utilisant godzilla = godzilla [godzilla ['Qty']> 150] .dropna () .


0 commentaires