Перевірте, чи існує значення в індексі фрейму даних панд


139

Я впевнений, що існує очевидний спосіб зробити це, але не можу придумати що-небудь вигадливе прямо зараз.

В основному замість підвищення винятку я хотів би отримати Trueабо Falseподивитися, чи існує значення в dfіндексі панд .

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

Відповіді:


252

Це повинно зробити трюк

'g' in df.index

7
Схоже, це не спрацьовує, коли кілька записів поділяють однакові значення індексу.
MaximG

2
@MaximG Що ти маєш на увазі? Це працює і для унікального індексу.
joris

Також працюйте для мультиіндексу. Якщо ваш індекс має довжину n, то кордон будь-якої довжини 1..nможна перевірити
Minh Triet

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

2
Це постійний час чи лінійний?
Локеш

36

Тільки для довідки, оскільки це було щось, що я шукав, ви можете перевірити наявність у значеннях чи індексі, додавши метод ".values", наприклад

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

Я вважаю, що додавання ".values" для отримання простого списку або ndarray змушує існувати або "in" чеки виконуватись більш плавно з іншими інструментами python. Просто думав, що я кину це людям.


але AttributeError: Об'єкт 'DataFrame' не має атрибута 'поле'
Gank

1
Привіт Ганку. "Поле" повинно було показати, що ви можете застосувати метод ".values" до різних полів фрейму даних, таких як стовпці або вибраний стовпець. ".index" - приклад заміни "поля" фактичним полем, яке є в наявності :) Я думаю, що це могло бути зрозуміліше ...
Єзекіїль Круглик

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

@watsonic - один момент застереження, щоб побачити, чи повертається один із них через ієрархію. Не забудьте подивитися, що випускають обидва (наприклад, в ipython або командному рядку), щоб переконатися, що ви розумієте, з чим ви порівнюєте. Ще одна річ, яку ви можете зробити з ієрархічними індексами, - це df.index.get_level_values ​​(<ім'я рівня>), щоб зробити речі більш зрозумілими - залежно від вашого застосування.
Єзекіїль Круглік

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не буде перевіряти тип. df['value'].isin([True]).any()спробуйте це, це також дасть вам True, тому що це відповідає 1. True -> 1.
Мохамед Тасін ах

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") 

Що таке istop?
Nabin

1

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

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

або де індекс df1 не існує в df2 ...

df3 = df1[~df1.index.isin(df2.index)]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.