2016-04-01 22 views
0

行にMultiIndexを持つPandas DataFrameがあるとします。複数の基準に基づいてインデックスのレベルの1つの値に基づいて行を削除するにはどうすればよいですか?例えば行を削除するpandasインデックスに基づくデータフレーム(複数の条件)(Python 3.5.1)

、Iは索引のcountyレベルがNaNであるすべての行を削除しても、それは「D」及び「G」に等しい場合、それを削除する私は

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 

を有していると仮定する。言い換えれば、私は、データフレーム

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

作品のしたがって、次の一種で終わるしたい:

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

しかし、問題は私の本当のユースケースでは、これらの基準のいくつかがあるということです。また、このメソッドを使用してNaNを削除する方法が見つからないようです。

ありがとうございます!

答えて

0

コールdropとそのインデックスレベルでそれらの値を持つ行のラベルをドロップするlevel='countyにリストを渡す:

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

あなたはブール値のインデックスを逆演算子(〜)を使用して試みることができます。

たとえば、次のコード行が言う

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

「郡は、いくつかのリストにない場合にはDFから選択して」

関連する問題