通过根据MultiIndex级别变化的值对列进行过滤

时间:2018-11-13 20:31:04

标签: python pandas filter multi-index

标题复杂,但问题很简单。我有一个具有MultiIndex的DataFrame:

enter image description here

我希望上面框架的行,但是'Filter Column'必须大于或等于下面filter_value系列中的值。

filter_value = Series([1, 3], ['red', 'blue'])

此玩具问题的正确解决方案是使用相同的数据帧,但仅保留(red, 2)(blue, 2)(blue, 3)行。

要为上述框架设置:

arrays = [['red', 'red', 'blue', 'blue', 'blue'], [1, 2, 1, 2, 3]]
idx = MultiIndex.from_arrays(arrays, names=['Color', 'Count'])

values = Series(2, idx, name='Value')
ratios = Series(range(5), idx, name='Filter Column')
df = concat([values, ratios], axis='columns')

2 个答案:

答案 0 :(得分:2)

好像您需要get_level_values + map,然后使用值比较将布尔过滤器df

df[df['Filter Column'].values>=df.index.get_level_values(0).map(filter_value)]
Out[108]: 
             Value  Filter Column
Color Count                      
red   2          2              1
blue  2          2              3
      3          2              4

答案 1 :(得分:2)

您可以尝试以下方法:

pd.concat(df.align(filter_value.rename('filter'), level=0, axis=0), axis=1)\
  .loc[lambda x: x['Filter Column']>=x['filter']]

输出:

             Value  Filter Column  filter
Color Count                              
red   2          2              1       1
blue  2          2              3       3
      3          2              4       3
相关问题