在pandas数据帧中删除特定的multiIndex列

时间:2017-03-16 14:25:32

标签: python pandas dataframe hierarchical-data multi-index

假设有一个如此创建的数据框:

tdata = {('A', 50): [1, 2, 3, 4],
         ('A', 55): [5, 6, 7, 8],
         ('B', 10): [10, 20, 30, 40],
         ('B', 20): [50, 60, 70, 80],
         ('B', 50): [2, 4, 6, 8],
         ('B', 55): [10, 12, 14, 16]}
tdf = pd.DataFrame(tdata, index=range(0,4))

      A      B
     50 55  10  20 50  55
   0  1  5  10  50  2  10
   1  2  6  20  60  4  12
   2  3  7  30  70  6  14
   3  4  8  40  80  8  16
  1. 如何从数据框中删除特定列,例如('B',10)和('B',20)?
  2. 有没有办法在一个命令中删除列,例如tdf.drop(['B', [10,20]])?请注意,我知道我的命令示例并不接近它应该是什么,但我希望它能得到满足。
  3. 有没有办法通过某些逻辑表达式删除列?例如,假设我想删除子级索引小于50的列(同样,10,20列)。我可以做一些包含列'A'的通用命令,即使10,20个子级索引不存在或者我必须专门引用列'B'吗?

1 个答案:

答案 0 :(得分:4)

您可以list tuples使用drop

print (tdf.drop([('B',10), ('B',20)], axis=1))
   A     B    
  50 55 50  55
0  1  5  2  10
1  2  6  4  12
2  3  7  6  14
3  4  8  8  16

要按level删除列:

mask = tdf.columns.get_level_values(1) >= 50
print (mask)
[ True  True False False  True  True]

print (tdf.loc[:, mask])
   A     B    
  50 55 50  55
0  1  5  2  10
1  2  6  4  12
2  3  7  6  14
3  4  8  8  16

如果需要按级别删除,则只能指定一个级别:

print (tdf.drop([50,55], axis=1, level=1))
    B    
   10  20
0  10  50
1  20  60
2  30  70
3  40  80