Python 从具有多级标头的数据帧中删除行

Python 从具有多级标头的数据帧中删除行,python,pandas,multi-index,Python,Pandas,Multi Index,我有一个包含两级标题的excel文件,并将其读入python,如下所示: data = pd.read_excel('file.xlsx', header = [0,1]) 接下来,我只想选择列“type”不是2的行。这应该是直截了当的,我使用了 data2 = data[data['type'] != 2] 昨天,这起作用了。今天,我得到了一个填充了NaN的数据帧,其中仍然包含类型为2的行。它没有给我一个错误。 出现此问题是因为它是多级标题吗?”类型“”位于顶行,第二行没有级别。例如: n

我有一个包含两级标题的excel文件,并将其读入python,如下所示:

data = pd.read_excel('file.xlsx', header = [0,1])
接下来,我只想选择列“type”不是2的行。这应该是直截了当的,我使用了

data2 = data[data['type'] != 2]
昨天,这起作用了。今天,我得到了一个填充了NaN的数据帧,其中仍然包含类型为2的行。它没有给我一个错误。 出现此问题是因为它是多级标题吗?”类型“”位于顶行,第二行没有级别。例如:

name  type   x
             a    b  c
A      1     4    3  7
B      2     2    6  1 
有什么建议吗

print (data.columns) 
给我:

MultiIndex(levels=[[1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 'TBvol', 'breastvol', 'clipno', 'cliptype', 'interval', 'lat', 'markerno', 'nCT', 'type', 'xTB', 'yTB', 'zTB'], ['Unnamed: 0_level_1', 'Unnamed: 10_level_1', 'Unnamed: 11_level_1', 'Unnamed: 1_level_1', 'Unnamed: 2_level_1', 'Unnamed: 3_level_1', 'Unnamed: 4_level_1', 'Unnamed: 5_level_1', 'Unnamed: 6_level_1', 'Unnamed: 7_level_1', 'Unnamed: 8_level_1', 'Unnamed: 9_level_1', 'fx', 'fy', 'fz', 'px', 'py', 'pz']],
           labels=[[15, 14, 13, 17, 16, 12, 11, 20, 21, 22, 18, 19, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10], [0, 3, 4, 5, 6, 7, 8, 9, 10, 11, 1, 2, 15, 16, 17, 15, 16, 17, 15, 16, 17, 15, 16, 17, 15, 16, 17, 15, 16, 17, 15, 16, 17, 15, 16, 17, 15, 16, 17, 15, 16, 17, 15, 16, 17, 12, 13, 14, 12, 13, 14, 12, 13, 14, 12, 13, 14, 12, 13, 14, 12, 13, 14, 12, 13, 14, 12, 13, 14, 12, 13, 14, 12, 13, 14, 12, 13, 14]],
           names=[None, 'PID'])

问题是,如果选择
type
column,则获取的不是一列,而是多个-
DataFrame

您可以看到它,例如,如果选择
x
,则使用样本数据进行测试-它是来自第一级的值,并返回所有列,如:

print (data)
  name type  x      
             a  b  c
0    A    1  4  3  7
1    B    2  2  6  1


print (data['x'])
   a  b  c
0  4  3  7
1  2  6  1
因此,可能的解决方案是通过元组选择的,如:

print (data[('x', 'a')])
0    4
1    2
Name: (x, a), dtype: int64
因此,您需要:

data2 = data[data[('type', 'second_level_value')] != 2]

什么是
print(df.columns)
?可能的值是字符串,因此需要
data2=data[data['type']!='2']
?@jezrael:值不是字符串,尝试“2”会给出类型错误:无法将['2']与块值进行比较