Фильтрация по столбцу по значению, которое изменяется в зависимости от уровня MultiIndex - PullRequest
0 голосов
/ 13 ноября 2018

Сложный заголовок, но довольно простая проблема.У меня есть DataFrame с MultiIndex:

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 голосов
/ 13 ноября 2018

Вы можете попробовать это:

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
0 голосов
/ 13 ноября 2018

Похоже, вам нужно 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
...