【问题标题】:Removing columns selectively from multilevel index dataframe从多级索引数据框中有选择地删除列
【发布时间】:2021-12-05 21:09:42
【问题描述】:

假设我们有一个这样的数据框,并希望在满足某些条件时删除列。

    df = pd.DataFrame(
np.arange(2, 14).reshape(-1, 4),
index=list('ABC'),
columns=pd.MultiIndex.from_arrays([
    ['data1', 'data2','data1','data2'],
    ['F', 'K','R','X'],
    ['C', 'D','E','E']
], names=['meter', 'Sleeper','sweeper'])
)

df

然后假设我们只想在 meter == data1sweeper == E 时删除 cols 所以我尝试了

df = df.drop(('data1','E'),axis = 1)

KeyError: 'E'

第二次尝试

df.drop(('data1','E'), axis = 1, level = 2)

KeyError: "在关卡中找不到标签 [('data1', 'E')]"

Pandas: drop a level from a multi-level column index?

【问题讨论】:

    标签: python pandas dataframe multi-index


    【解决方案1】:

    您必须单独执行它们,因为它们处于不同的级别:

    df.drop('data1', axis=1, level='meter').drop('E', axis = 1, level='sweeper')
    Out[833]: 
    meter   data2
    Sleeper     K
    sweeper     D
    A           3
    B           7
    C          11
    

    【讨论】:

      【解决方案2】:

      似乎drop 不支持在拆分级别上进行选择(此处为[0,2])。我们可以使用 get_level_values 来创建带有条件的掩码:

      # keep where not ((level0 is 'data1') and (level2 is 'E'))
      col_mask = ~((df.columns.get_level_values(0) == 'data1')
                   & (df.columns.get_level_values(2) == 'E'))
      df = df.loc[:, col_mask]
      

      我们也可以通过排除特定索引切片中的 loc 来通过整数位置执行此操作,但是,这总体上不太清晰且不太灵活:

      idx = pd.IndexSlice['data1', :, 'E']
      cols = [i for i in range(len(df.columns))
              if i not in df.columns.get_locs(idx)]
      df = df.iloc[:, cols]
      

      任何一种方法都会产生df

      meter   data1 data2    
      Sleeper     F     K   X
      sweeper     C     D   E
      A           2     3   5
      B           6     7   9
      C          10    11  13
      

      【讨论】:

        猜你喜欢
        • 2013-06-09
        • 2021-10-14
        • 2019-12-30
        • 1970-01-01
        • 2017-10-30
        • 1970-01-01
        相关资源
        最近更新 更多