2017-07-19 2 views
3

J'ai une trame appelée xxx. Une colonne de xxx est finale et xxx ressemble à cePython .drop ne donne pas le résultat attendu

FpPropeTypCode DTE_DATE_DEATH    Area   Final 
0    FP   NaN Ame_MidEast_Lnd   NaN 
1    FP   NaN Southern_Europe W.E.M. Lines 
2    FP   NaN    NaN   NaN 
3    ZP   NaN Ame_MidEast_Lnd   NaN 
4    YY   NaN Ame_MidEast_Lnd   NaN 

Je voudrais supprimer toutes les lignes qui a NaN final, donc ce que je faisais était

xxx= xxx.drop(pd.isnull(data_file_fp4['Final']))

Malheureusement ce que je suis arrivé est

FpPropeTypCode DTE_DATE_DEATH    Area       Final 
2    FP   NaN    NaN       NaN 
3    ZP   NaN Ame_MidEast_Lnd       NaN 
4    YY   NaN Ame_MidEast_Lnd       NaN 
5    NN   NaN Ame_MidEast_Lnd NORTH ARM TRANSPORTATION LTD 
6    CP   NaN Northern_Europe      MPC Group 

qui est évidemment pas droit ...

Ce que j'ai réellement besoin de faire est de supprimer des lignes en fonction de deux conditions: Final étant NaN et Area étant Ame_MidEast_Lnd. Donc, je ne peux pas vraiment utiliser dropna

Qu'est-ce qui n'allait pas dans mes codes actuels juste pour faire la première condition? Merci d'avance.

Répondre

4

Utilisez-vous des pandas? Pandas a une fonction qui vous permettra de déposer des lignes en fonction de critères, dans ce cas, une certaine colonne étant NaN: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.html

La commande spécifique que vous cherchez serait probablement quelque chose comme:

xxx = xxx.dropna(axis=0, subset=['Final']) 

axe = 0 indique que vous souhaitez supprimer des lignes et des colonnes non sous-ensemble spécifie que vous souhaitez déposer où « final » est NaN

EDIT: Le demandeur ne peut pas utiliser dropna parce que leur logique de filtrage est plus complexe.

Si vous voulez une logique plus complexe, vous feriez mieux de faire simplement de la logique de support. Je vais essayer de vérifier dans un moment mais pouvez-vous essayer quelque chose comme ceci:

xxx = xxx[~xxx['Final'].isnull()] 

Si vous voulez que la deuxième partie de la logique, où vous avez à la fois le filtre NaN et le filtre de colonne, vous feriez ceci:

xxx = xxx[~(xxx['Final'].isnull() & xxx['Area'].str.contains("Ame_MidEast_Lnd"))] 

J'ai vérifié que cela fonctionne en exécutant ce fichier python ci-dessous:

import pandas as pd 
import numpy as np 

xxx = pd.DataFrame([ 
        ['FP', np.nan, 'Ame_MidEast_Lnd', np.nan], 
        ['FP', np.nan, 'Southern_Europe', 'W.E.M. Lines'], 
        ['FP', np.nan, np.nan, np.nan], 
        ['ZP', np.nan, 'Ame_MidEast_Lnd', np.nan], 
        ['YY', np.nan, 'Ame_MidEast_Lnd', np.nan]], 
        columns=['FpPropeTypCode','DTE_DATE_DEATH','Area', 'Final'] 
        ) 

# before 
print xxx 

# whatever rows have both 'Final' as NaN and 'Area' containing Ame_MidEast_Lnd, we do NOT want those rows 
xxx = xxx[~(xxx['Final'].isnull() & xxx['Area'].str.contains("Ame_MidEast_Lnd"))] 

# after 
print xxx 

vous verrez la solution fonctionne comme vous le souhaitez.

+0

Salut, merci beaucoup pour votre aide! Ce que je dois réellement faire est de laisser tomber des rangées basées sur deux conditions: Final étant NaN et Area étant Ame_MidEast_Lnd. Donc, je ne peux pas vraiment utiliser dropna – TingTing

+0

Ok, donnez-moi une seconde pour tester quelque chose. – itsmichaelwang

+0

@TingTing Je crois que j'ai une solution qui gère à la fois votre exigence isNull et votre filtre de colonne. S'il vous plaît laissez-moi savoir si cela résout votre problème. – itsmichaelwang