2016-04-01 15 views
0

Angenommen, ich habe einen Pandas DataFrame mit MultiIndex in Zeilen. Wie kann ich Zeilen basierend auf dem Wert einer der Ebenen des Index basierend auf mehreren Kriterien löschen?Löschen von Zeilen Pandas Dataframe basierend auf Index (mehrere Kriterien) (Python 3.5.1)

Beispiel: Angenommen, ich habe

import pandas as pd 

df = {'population': [100, 200, 300, 400, 500, 600, 700, 800]} 
arrays = [['NJ', 'NJ', 'NY', 'NY', 'CA', 'CA', 'NV', 'NV'], 
      ['A', 'B', None, 'D', 'E', 'F', None, 'G']] 
tuples = list(zip(*arrays)) 
index = pd.MultiIndex.from_tuples(tuples, names=['state', 'county']) 

df = pd.DataFrame(df, index=index) 

        population 
state county 
NJ  A   100 
      B   200 
NY  NaN  300 
      D   400 
CA  E   500 
      F   600 
NV  NaN  700 
      G   800 

ich alle Zeilen gelöscht werden soll, wo das county Niveau des Index NaN ist und auch zu löschen, wenn es gleich ‚D‘ ist und ‚G‘. Mit anderen Worten, ich mag mit einem Datenrahmen

    population 
state county 
NJ  A   100 
      B   200 
      D   400 
CA  E   500 
      F   600 

ist also folgende Art von Arbeiten am Ende:

df = df.iloc[df.index.get_level_values('county') != 'D'] 
df = df.iloc[df.index.get_level_values('county') != 'G'] 

Aber das Problem ist, dass in meinem realen Anwendungsfall gibt diese Kriterien mehrere ist. Außerdem kann ich keinen Weg finden, NaNs mit dieser Methode zu löschen.

Danke!

Antwort

0

Anruf drop und eine Liste auf level='county passieren Zeilenbeschriftungen mit diesen Werten auf diesem Index Ebene fallen:

In [284]: 
df.drop(['D','G',np.NaN], level='county') 

Out[284]: 
       population 
state county    
NJ A    100 
     B    200 
CA E    500 
     F    600 
0

Sie könnten versuchen, den inversen Operator (~) auf boolean Indizierung. Zum Beispiel

import numpy as np 
df[~(df.index.get_level_values('county').isin(['A', 'B', np.nan]))] 

diese Codezeile sagt: „Wählen Sie aus df wo Kreis nicht in einer Liste ist“

Verwandte Themen