パンダデータフレームインデックスに値が存在するかどうかを確認します


139

これを行うための明白な方法があると私は確信していますが、現在、滑らかなものについて考えることはできません。

基本的に例外を発生させる代わりに、パンダインデックスに値が存在するかどうTrueFalseを取得または確認したいと思い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
any(df.index == 'g')はどうですか?
luffe 2014年

回答:


252

これでうまくいくはずです

'g' in df.index

7
複数のエントリが同じインデックス値を共有している場合、これは機能しないようです。
MaximG 2014年

2
@MaximGどういう意味ですか?これは、一意でないインデックスでも機能します。
joris 2015

マルチインデックスでも機能します。インデックスに長さがある場合、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
これは一定の時間ですか、それとも線形ですか?
ロケシュ

36

参考までに、私が探していたものとして、「。values」メソッドを追加して、値またはインデックス内の存在をテストできます。たとえば、

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

単純なリストまたはndarrayを取得するために「.values」を追加すると、他のpythonツールでよりスムーズに実行または「in」チェックが実行されることがわかりました。ちょうど私がそれを人々のためにそこに捨てると思いました


AttributeError: 'DataFrame' object has no attribute 'field'
Gank

1
こんにちはガンク。「フィールド」は、「。values」メソッドを列や選択した列などのデータフレームのさまざまなフィールドに適用できることを示しているはずです。".index"は、 "field"を実際に使用可能なフィールドに置き換える例です。:)
わかりやすいと思い

2
これは指摘するのに本当に役に立ちました。in g in df.indextrueとin g in df.index.valuesfalseを生成する階層的なケースがあります。面白い。
watsonic 2015

@watsonic-階層が原因でそれらの1つがタプルを返すかどうかを確認するための注意点が1つあります。両方が何を出力しているのか(ipythonやコマンドラインなど)を確認して、比較対象を確実に理解してください。階層的なインデックスで実行できるもう1つのことは、df.index.get_level_values(<レベル名>)です。これは、当然のことですが、アプリケーションに応じて、よりわかりやすくします。
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


isindtypeをチェックしません。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") 

isStopとは何ですか?
Nabin、

1

以下のコードはブール値を出力しませんが、インデックスによるデータフレームのサブセット化を可能にします...これはおそらく問題を解決する最も効率的な方法ではないことを理解していますが、私は(1)これが読み取る方法が好きで、(2)簡単にサブセット化できますdf1インデックスがdf2に存在する場合:

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

または、df1インデックスがdf2に存在しない場合...

df3 = df1[~df1.index.isin(df2.index)]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.