使用 multi-level header 从数据框中删除行

Delete rows from dataframe with multi-level header

我有一个 excel 文件,其中包含 2 个级别的 header 并将其读入 python,如下所示:

data = pd.read_excel('file.xlsx', header = [0,1])

接下来,我想 select 仅 'type' 列不是 2 的行。这应该很简单,我使用了

data2 = data[data['type'] != 2]

昨天,这成功了。今天,我得到一个充满 NaN 的数据框,其中仍然包含类型为 =2 的行。它不会给我一个错误。 出现这个问题是不是因为是multi-levelheader? 'type' 在最上面一行,它在第二行没有级别。示例:

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'])

问题是如果 select type 列,得到的不是一列,而是多列 - DataFrame.

你可以看到它,例如如果使用示例数据进行测试,如果 select x - 它是第一级的值和 return 所有列,如:

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

所以可能的解决方案是 select 像这样的元组:

print (data[('x', 'a')])
0    4
1    2
Name: (x, a), dtype: int64

所以你需要:

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