#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')