2017-10-17 6 views
1

j'ai un fichier csv (ou dataframe) comme ci-dessous:Python: Suppression de lignes de dataframe dont la valeur n'existe pas dans le dictionnaire

Text Location State 
A Florida, USA Florida 
B NY    New York 
C  
D abc 

Et un dictionnaire avec une paire de valeurs clés comme:

stat_map = { 
     'FL': 'Florida', 
     'NY': 'New York', 
     'AR': 'Arkansas', 
} 

Comment puis-je supprimer les rangées 3 et 4, c.-à-d. La ligne avec le texte C & D afin que mon fichier ne contienne que les lignes pour lesquelles j'ai une valeur dans le dictionnaire. Toutes les lignes pour lesquelles l'état est vide ou dont la valeur n'est pas dans la valeur du dictionnaire doivent être supprimées. La sortie finale devrait ressembler à:

Text Location State 
    A Florida, USA Florida 
    B NY    New York 

S'il vous plaît aider.

+0

Pourquoi n'êtes-vous pas retirez la Floride? Ce n'est pas une clé dans votre dict après tout. –

+0

Ce n'est pas en dict, mais dans la valeur du dictionnaire. La colonne 'State' de la base de données contient de nombreuses valeurs qui n'existent pas dans la valeur du dictionnaire. J'ai besoin de conserver toutes ces lignes de données pour lesquelles la valeur existe dans la valeur du dictionnaire. Et supprimez uniquement ceux pour lesquels la valeur ne correspond pas aux valeurs du dictionnaire. – Alex

+0

Possible duplication de [Suppression de la ligne DataFrame dans Pandas en fonction de la valeur de la colonne] (https://stackoverflow.com/questions/18172851/deleting-dataframe-row-in-pandas-based-on-column-value) –

Répondre

0

Utilisez extract + replace, dernière supprimer des lignes par dropna:

stat_map = { 
     'FL': 'Florida', 
     'NY': 'New York', 
     'AR': 'Arkansas', 
} 

#get list from all values from keys and values of dict 
L = list(stat_map.keys()) + list(stat_map.values()) 
print (L) 
['NY', 'FL', 'AR', 'New York', 'Florida', 'Arkansas'] 


df['State1'] = df['Location'].str.extract('(' + '|'.join(L) + ')', expand=False) 
          .replace(stat_map) 
df = df.dropna(subset=['State1']) 
print (df) 
    Text  Location  State State1 
0 A Florida, USA Florida Florida 
1 B   NY New York New York 
+0

Merci partager ce morceau de code. Pourriez-vous également conseiller comment puis-je supprimer une colonne de texte de cette base de données. – Alex

+0

Pensez-vous que 'df = df.drop ('Text', axis = 1)'? – jezrael

+0

Merci! Ça a marché. Merci :) – Alex