检查pandas数据框索引中是否存在值


139

我敢肯定有一个明显的方法可以做到这一点,但是现在还不能想到任何光滑的东西。

基本上不是引发异常,而是要获取TrueFalse查看pandas 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 2014年

Answers:


252

这应该可以解决问题

'g' in df.index

7
当多个条目共享相同的索引值时,这似乎不起作用。
MaximG

2
@MaximG是什么意思?这也适用于非唯一索引。
joris 2015年

也适用于多索引。如果您的索引具有length n,那么1..n可以检查任何长度的元组
Minh Triet

2
对于来这里的其他人,'g' in df.columns如果您的数据框是用列标题而不是索引定义的,则可能需要使用,例如:df = pandas.DataFrame({'test':[1,2,3,4]}, columns=['a','b','c','d'])
Tahlor

2
这是恒定时间还是线性的?
Lokesh

36

仅供参考,这是我一直在寻找的东西,您可以通过附加“ .values”方法来测试值或索引中是否存在,例如

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

我发现添加“ .values”以获取简单的列表或ndarray会使存在或“输入”检查与其他python工具一起运行更为流畅。只是以为我会把那个扔给别人。


但AttributeError的:“数据帧”对象没有属性“字段”
的Gank

1
嗨,Gank。“字段”应该显示为可以将“ .values”方法应用于数据框的各个字段,例如列或选定的列。“ .index”是用可用的实际字段替换“ field”的示例:)我想这可能会更清楚...
Ezekiel Kruglick

2
指出这一点确实很有帮助。我有一个in g in df.index产生真假的分层案例in g in df.index.values。有趣。
watsonic

@watsonic-一个警告点是要查看其中之一是否由于层次结构而返回元组。确保查看两者的内容(例如,在ipython或命令行中),以确保您了解要比较的内容。可以使用分层索引执行的另一件事是df.index.get_level_values(<level name>)使事情更容易理解-当然取决于您的应用程序。
Ezekiel Kruglick 2015年

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,因为它与匹配1True -> 1
Mohamed Thasin ah

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

什么是停止?
纳宾

1

下面的代码不打印布尔值,但允许按索引对数据框进行子集设置...我知道这可能不是解决问题的最有效方法,但是我(1)喜欢这种读取方式,并且(2)您可以轻松地进行子集化df2中存在df1索引的位置:

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

或df2中不存在df1索引的地方...

df3 = df1[~df1.index.isin(df2.index)]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.