2016-10-13 3 views
1

У меня есть dataframe pandas, содержащий индексы, которые имеют отношения «один ко многим». Очень упрощенный и сокращенный пример моих данных показан в ссылке DataFrame Example. Я хочу, чтобы получить список или серии или ndarray уникальных значений namIdx, в которых nCldLayers < = 1. Конечный результат должен показать индексы 601 и 603.Фильтрация синтаксиса для pandas dataframe groupby с логическим условием

  1. я в состоянии сделать это с 3 заявления ниже, но мне интересно, есть ли намного лучший, более сжатый способ, возможно, с помощью «фильтра», «выбрать» или «где».

    grouped=(namToViirs['nCldLayers']<=1).groupby(namToViirs.index).all(axis=0) 
    grouped = grouped[grouped==True] 
    filterIndex = grouped.index 
    
  2. Есть ли лучший подход в достижении этого результата, применяя логическое условие (namToViirs [ 'nCldLayers> = 1) в последующей части цепи, то есть, первая группа затем применить логическое условие, а затем получить только namIdx, где логический результат верен для каждого члена группы?

+1

Не уверен, что ваш второй вопрос, но ваш первый, что о 'Set ((namToViirs [«nCldLayers» ] <= 1) .index) '? – dmn

ответ

1

Я думаю, что ваш код работает хорошо, только вы можете добавить использовать небольшие изменения:

В all можно опускает axis=0
grouped==True можно опустить ==True

grouped=(namToViirs['nCldLayers']<=1).groupby(level='namldx').all() 
grouped = grouped[grouped] 
filterIndex = grouped.index 
print (filterIndex) 
Int64Index([601, 603], dtype='int64', name='namldx') 

Я думаю, что лучше первый фильтр на boolean indexing, а затем groupby, потому что меньше циклов -> лучшая производительность.

0

На вопрос 1, см. Ответ от jezrael. На вопрос 2 вы можете играть с индексами в виде наборов:

namToViirs.index[namToViirs.nCldLayers <= 1] \ 
      .difference(namToViirs.index[namToViirs.nCldLayers > 1]) 
0

Вы могли бы быть заинтересованы в this answer.

Реализация в настоящее время немного хака, но это должно уменьшить ваше заявление выше:

filterIndex = ((namToViirs['nCldLayers']<=1) 
       .groupby(namToViirs.index).all(axis=0)[C()].index) 
Смежные вопросы