Kiểm tra nếu một giá trị tồn tại trong chỉ mục khung dữ liệu gấu trúc


139

Tôi chắc chắn có một cách rõ ràng để làm điều này nhưng không thể nghĩ ra bất cứ điều gì lắt léo ngay bây giờ.

Về cơ bản thay vì tăng ngoại lệ, tôi muốn nhận Truehoặc Falsexem liệu giá trị có tồn tại trong dfchỉ số gấu trúc hay không .

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

Những gì tôi đã làm việc bây giờ là như sau

sum(df.index == 'g')

1
Điều gì về bất kỳ (df.index == 'g')?
luffe

Câu trả lời:


252

cái này cần phải dùng mẹo

'g' in df.index

7
Điều này dường như không hoạt động khi một số mục chia sẻ cùng một giá trị chỉ mục.
MaximG

2
@MaximG Ý bạn là gì? Điều này làm việc cho một chỉ số không duy nhất là tốt.
joris

Cũng làm việc cho đa chỉ số. Nếu chỉ mục của bạn có độ dài n, thì 1..ncó thể kiểm tra một tuple có độ dài bất kỳ
Minh

2
Đối với những người khác đến đây, bạn có thể cần sử dụng 'g' in df.columnsnếu khung dữ liệu của bạn được xác định bằng các tiêu đề cột thay vì chỉ mục, ví dụ:df = pandas.DataFrame({'test':[1,2,3,4]}, columns=['a','b','c','d'])
Tahlor

2
Đây là thời gian không đổi hoặc tuyến tính?
Lokesh

36

Chỉ để tham khảo vì đó là thứ tôi đang tìm kiếm, bạn có thể kiểm tra sự hiện diện trong các giá trị hoặc chỉ mục bằng cách nối thêm phương thức ".values", vd

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

Tôi thấy rằng việc thêm ".values" để có được một danh sách đơn giản hoặc ndarray out sẽ tồn tại hoặc kiểm tra "trong" chạy trơn tru hơn với các công cụ python khác. Chỉ cần nghĩ rằng tôi sẽ ném nó ra cho mọi người.


nhưng AttributionError: 'Đối tượng DataFrame' không có thuộc tính 'trường'
Gank

1
Chào Gank. "Trường" được cho là cho thấy bạn có thể áp dụng phương thức ".values" cho các trường khác nhau của khung dữ liệu như cột hoặc cột được chọn. ".index" là một ví dụ về việc thay thế "trường" bằng một trường thực tế có sẵn :) Tôi đoán điều đó có thể rõ ràng hơn ...
Ezekiel Kruglick

2
Điều này thực sự hữu ích để chỉ ra. Tôi có một trường hợp phân cấp trong đó in g in df.indexsản xuất đúng và in g in df.index.valuessai. Hấp dẫn.
watsonic

@watsonic - Một điểm thận trọng là phải xem liệu một trong số đó có trả lại bộ dữ liệu do phân cấp không. Đảm bảo xem cả hai thứ đang đưa ra (ví dụ như trong ipython hoặc dòng lệnh) để đảm bảo bạn hiểu những gì bạn đang so sánh. Một điều khác bạn có thể làm với các chỉ mục phân cấp là df.index.get_level_values ​​(<tên cấp độ>) để làm cho mọi thứ dễ hiểu hơn - tất nhiên tùy thuộc vào ứng dụng của bạn.
Ezekiel Kruglick

28

Multi index hoạt động hơi khác so với chỉ mục đơn. Dưới đây là một số phương pháp cho khung dữ liệu đa chỉ mục.

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 chỉ hoạt động ở cấp độ đầu tiên khi kiểm tra giá trị chỉ mục duy nhất.

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

Kiểm tra df.index.levelscác cấp độ khác.

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

Kiểm tra df.indexmột tuple kết hợp chỉ mục.

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

2

với DataFrame: df_data

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

Tôi đã thử:

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

nhưng:

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

Vui quá


isinsẽ không kiểm tra dtype. df['value'].isin([True]).any()Hãy thử điều này, nó cũng sẽ cung cấp cho bạn Đúng, Bởi vì nó phù hợp với 1. True -> 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") 

Top là gì?
Nabin

1

Mã bên dưới không in boolean, nhưng cho phép đặt lại khung dữ liệu theo chỉ mục ... Tôi hiểu rằng đây có thể không phải là cách hiệu quả nhất để giải quyết vấn đề, nhưng tôi (1) thích cách đọc này và (2) bạn có thể dễ dàng tập hợp con trong đó chỉ số df1 tồn tại trong df2:

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

hoặc nơi chỉ số df1 không tồn tại trong df2 ...

df3 = df1[~df1.index.isin(df2.index)]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.