删除行pandas基于索引的Dataframe(多个条件)(Python 3.5.1)

时间:2016-04-01 08:53:47

标签: python pandas

假设我在行上有一个带有MultiIndex的Pandas DataFrame。如何根据多个条件根据索引的某个级别的值删除行?

例如,假设我有

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   

我想删除索引的county级别为NaN的所有行,并且当它等于'D'和'G'时也删除它。换句话说,我想最终得到一个DataFrame

                   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的方法。

谢谢!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您可以尝试对布尔索引使用逆运算符(〜)。例如,

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

这行代码说“从df中选择县不在某些列表中”