【问题标题】:Drop specific multiIndex columns in a pandas dataframe在 pandas 数据框中删除特定的 multiIndex 列
【发布时间】:2017-08-07 18:58:12
【问题描述】:

假设有一个这样创建的数据框:

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”列吗?

【问题讨论】:

  • 你能解释更多吗Can I do some general command that would encompass column 'A', even though the 10,20 sublevel indices don't exist or must I specifically reference column 'B'?
  • @jezrael 感谢您的提问。我想知道我是否可以做一些类似通配符顶级'A'和'B'的事情,然后去寻找我不想要的子级别,比如 tdf.drop([:, [10,20]])。
  • 我认为不是,这是不可能的。只能通过slicers 选择,而不是丢弃。

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


【解决方案1】:

您可以使用drop by list of tuples

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    • 2017-08-17
    • 2019-06-07
    • 1970-01-01
    • 2021-11-11
    • 2014-04-08
    相关资源
    最近更新 更多