Проверьте, существует ли значение в индексе фрейма данных pandas


145

Я уверен, что есть очевидный способ сделать это, но сейчас не могу придумать ничего приятного.

В основном, вместо того, чтобы вызывать исключение, я хотел бы получить Trueили Falseувидеть, существует ли значение в dfиндексе pandas .

import pandas as pd
df = pd.DataFrame({'test':[1,2,3,4]}, index=['a','b','c','d'])
df.loc['g']  # (should give False)

Сейчас я работаю над следующим

sum(df.index == 'g')

1
А что насчет любого (df.index == 'g')?
luffe

Ответы:


264

Это должно сработать

'g' in df.index

7
Это не работает, если несколько записей имеют одинаковые значения индекса.
MaximG

2
@MaximG Что ты имеешь в виду? Это также работает для неуникального индекса.
joris

Также работает с мультииндексом. Если ваш индекс имеет длину n, то 1..nможно проверить кортеж любой длины из
Минь Триет

2
Для других, приходящих сюда, вам может потребоваться использовать, 'g' in df.columnsесли ваш фрейм данных был определен с заголовками столбцов, а не индексом, например:df = pandas.DataFrame({'test':[1,2,3,4]}, columns=['a','b','c','d'])
Тахлор

3
Это постоянное время или линейное?
Локеш

38

Просто для справки, поскольку это то, что я искал, вы можете проверить наличие в значениях или индексе, добавив метод ".values", например

g in df.<your selected field>.values
g in df.index.values

Я обнаружил, что добавление «.values» для получения простого списка или ndarray out делает существующие или «входящие» проверки более плавно с другими инструментами Python. Просто подумал, что брошу это людям.


но AttributeError: объект DataFrame не имеет атрибута field
Gank

1
Привет, Ганк. «Поле» должно было показать, что вы можете применить метод «.values» к различным полям фрейма данных, таким как столбцы или выбранный столбец. ".index" - это пример замены "field" фактическим доступным полем :) Думаю, это могло бы быть более понятным ...
Иезекииль Круглик

2
Это было действительно полезно отметить. У меня есть иерархический случай, когда in g in df.indexвыдает истину и in g in df.index.valuesложь. Интересно.
watsonic

@watsonic - одно предостережение, чтобы увидеть, возвращает ли один из них кортежи из-за иерархии. Обязательно посмотрите, что они выводят (например, в ipython или в командной строке), чтобы убедиться, что вы понимаете, с чем сравниваете. Еще одна вещь, которую вы можете сделать с иерархическими индексами, - это df.index.get_level_values ​​(<level name>), чтобы сделать вещи более понятными - конечно, в зависимости от вашего приложения.
Иезекииль Круглик

28

Мультииндекс работает немного иначе, чем одиночный индекс. Вот несколько методов для мультииндексированного фрейма данных.

df = pd.DataFrame({'col1': ['a', 'b','c', 'd'], 'col2': ['X','X','Y', 'Y'], 'col3': [1, 2, 3, 4]}, columns=['col1', 'col2', 'col3'])
df = df.set_index(['col1', 'col2'])

in df.index работает для первого уровня только при проверке одиночного значения индекса.

'a' in df.index     # True
'X' in df.index     # False

Проверьте df.index.levelsдругие уровни.

'a' in df.index.levels[0] # True
'X' in df.index.levels[1] # True

Проверьте df.indexкортеж с комбинацией индексов.

('a', 'X') in df.index  # True
('a', 'Y') in df.index  # False

2

с DataFrame: df_data

>>> df_data
  id   name  value
0  a  ampha      1
1  b   beta      2
2  c     ce      3

Я старался:

>>> getattr(df_data, 'value').isin([1]).any()
True
>>> getattr(df_data, 'value').isin(['1']).any()
True

но:

>>> 1 in getattr(df_data, 'value')
True
>>> '1' in getattr(df_data, 'value')
False

Так весело: D


isinне будет проверять dtype. df['value'].isin([True]).any()попробуйте это, он также даст вам True, потому что он совпадает с 1. True -> 1.
Mohamed Thasin ah

2

Код ниже не печатает логическое значение, но позволяет разбивать фреймы данных по индексу ... Я понимаю, что это, вероятно, не самый эффективный способ решения проблемы, но мне (1) нравится, как это читается, и (2) вы можете легко подмножество где индекс df1 существует в df2:

df3 = df1[df1.index.isin(df2.index)]

или где индекс df1 не существует в df2 ...

df3 = df1[~df1.index.isin(df2.index)]

1
df = pandas.DataFrame({'g':[1]}, index=['isStop'])

#df.loc['g']

if 'g' in df.index:
    print("find g")

if 'isStop' in df.index:
    print("find a") 

Что такое isStop?
Набин
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.