Pandas: как проверить, соответствует ли какая-либо строка в индексе условию a

#python #pandas

#python #pandas

Вопрос:

Приведенный пример df:

 index1  index2  value
a       1       5
a       1       4
a       2       2
b       1       1
b       1       1
b       2       3
c       1       2
c       1       4
c       2       6
  

Как отфильтровать по индексу 1, возможно, аналогично df = df[df=…], все записи, которые соответствуют некоторому условию по значению?
Пример: мне нужны все записи в index1, где любая из записей в index1 больше 4. Тогда результат должен выглядеть так:

 index1  index2  value
a       1       5
a       1       4
a       2       2
c       1       2
c       1       4
c       2       6
  

b был отфильтрован, поскольку ни одно из его значений не соответствовало условию.

Ответ №1:

Если index1, index2 являются столбцами, сначала отфильтруйте index1 условие соответствия, а затем отфильтруйте исходный столбец по Series.isin :

 df1 = df[df['index1'].isin(df.loc[df['value'].gt(4), 'index1'])]
print (df1)
  index1  index2  value
0      a       1      5
1      a       1      4
2      a       2      2
6      c       1      2
7      c       1      4
8      c       2      6
  

Или используйте GroupBy.transform with any для проверки хотя бы одного совпадения:

 df1 = df[df['value'].gt(4).groupby(df['index1']).transform('any')]
  

Если есть MultiIndex :

 idx = df.index.get_level_values(0)
df2 = df[idx.isin(idx[df['value'].gt(4)])]
print (df2)
               value
index1 index2       
a      1           5
       1           4
       2           2
c      1           2
       1           4
       2           6
  

 df[df['value'].gt(4).groupby(level=0).transform('any')]
  

Ответ №2:

Вы можете получить желаемый результат df[df['value'] >= 4] . Если вам нужны только значения index1 из этого, вы можете использовать get_level_values его для обработки как обычный столбец. Например:

 print(df[df['value'] >= 4]].index.get_level_values(0))
  

вывод:

 Index(['a', 'a', 'c', 'c'], dtype='object', name='index1')