ตรวจสอบว่ามีค่าอยู่ในดัชนี dataframe ของแพนด้า


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ถ้า dataframe ของคุณถูกกำหนดด้วยส่วนหัวคอลัมน์แทนที่จะเป็นดัชนีเช่น: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" เพื่อให้ได้รายการที่เรียบง่ายหรือทำให้รายการมีอยู่หรือการตรวจสอบ "ใน" ทำงานได้ราบรื่นขึ้นด้วยเครื่องมือหลามอื่น ๆ แค่คิดว่าฉันจะโยนมันออกไปเพื่อคน


แต่ AttributeError: วัตถุ 'DataFrame' ไม่มีแอตทริบิวต์ 'ฟิลด์'
Gank

1
สวัสดี Gank "ฟิลด์" ควรแสดงให้เห็นว่าคุณสามารถใช้วิธี ".values" กับฟิลด์ต่างๆของดาต้าเฟรมเช่นคอลัมน์หรือคอลัมน์ที่เลือก ".index" เป็นตัวอย่างของการแทนที่ "field" ด้วยฟิลด์จริงที่พร้อมใช้งาน :) ฉันเดาว่ามันอาจจะชัดเจนกว่า ...
Ezekiel Kruglick

2
สิ่งนี้มีประโยชน์จริง ๆ ที่ชี้ให้เห็น ฉันมีกรณีแบบลำดับขั้นที่in g in df.indexทำให้เกิดจริงและin g in df.index.valuesเท็จ น่าสนใจ
watsonic

@watsonic - จุดเตือนหนึ่งจุดคือดูว่ามีสิ่งใดสิ่งหนึ่งที่คืนค่า tuples เนื่องจากลำดับชั้น ตรวจสอบให้แน่ใจว่าได้ดูว่าทั้งคู่กำลังวางอะไร (เช่นใน ipython หรือ command line) เพื่อให้แน่ใจว่าคุณเข้าใจสิ่งที่คุณกำลังเปรียบเทียบ อีกสิ่งที่คุณสามารถทำได้กับดัชนีลำดับชั้นคือ df.index.get_level_values ​​(<ระดับชื่อ>) เพื่อทำให้สิ่งต่าง ๆ เข้าใจได้มากขึ้น - ขึ้นอยู่กับการสมัครของคุณแน่นอน
Ezekiel Kruglick

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() . 1True -> 1
Mohamed Thasin อา

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

หยุดคืออะไร
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.