假设我在行上有一个带有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的方法。
谢谢!
答案 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中选择县不在某些列表中”