วิธีการใช้ 'ใน' และ 'ไม่ได้อยู่ใน' สำหรับ DataFrame นุ่น?
Pandas เสนอวิธีการสองวิธี: Series.isin
และDataFrame.isin
สำหรับ Series และ DataFrames ตามลำดับ
กรอง DataFrame ตามหนึ่งคอลัมน์ (ยังใช้กับซีรี่ส์)
สถานการณ์ที่พบบ่อยที่สุดคือการใช้isin
เงื่อนไขในคอลัมน์ที่ระบุเพื่อกรองแถวใน DataFrame
df = pd.DataFrame({'countries': ['US', 'UK', 'Germany', np.nan, 'China']})
df
countries
0 US
1 UK
2 Germany
3 China
c1 = ['UK', 'China'] # list
c2 = {'Germany'} # set
c3 = pd.Series(['China', 'US']) # Series
c4 = np.array(['US', 'UK']) # array
Series.isin
ยอมรับประเภทต่างๆเป็นอินพุต ต่อไปนี้เป็นวิธีที่ถูกต้องในการได้รับสิ่งที่คุณต้องการ:
df['countries'].isin(c1)
0 False
1 True
2 False
3 False
4 True
Name: countries, dtype: bool
# `in` operation
df[df['countries'].isin(c1)]
countries
1 UK
4 China
# `not in` operation
df[~df['countries'].isin(c1)]
countries
0 US
2 Germany
3 NaN
# Filter with `set` (tuples work too)
df[df['countries'].isin(c2)]
countries
2 Germany
# Filter with another Series
df[df['countries'].isin(c3)]
countries
0 US
4 China
# Filter with array
df[df['countries'].isin(c4)]
countries
0 US
1 UK
กรองบนคอลัมน์จำนวนมาก
บางครั้งคุณอาจต้องการใช้การตรวจสอบความเป็นสมาชิกแบบ 'in' กับคำค้นหาบางคำในหลายคอลัมน์
df2 = pd.DataFrame({
'A': ['x', 'y', 'z', 'q'], 'B': ['w', 'a', np.nan, 'x'], 'C': np.arange(4)})
df2
A B C
0 x w 0
1 y a 1
2 z NaN 2
3 q x 3
c1 = ['x', 'w', 'p']
หากต้องการใช้isin
เงื่อนไขกับทั้งคอลัมน์ "A" และ "B" ให้ใช้DataFrame.isin
:
df2[['A', 'B']].isin(c1)
A B
0 True True
1 False False
2 False False
3 False True
จากนี้เพื่อรักษาแถวที่มีคอลัมน์อย่างน้อยหนึ่งคอลัมน์True
เราสามารถใช้any
ตามแกนแรก:
df2[['A', 'B']].isin(c1).any(axis=1)
0 True
1 False
2 False
3 True
dtype: bool
df2[df2[['A', 'B']].isin(c1).any(axis=1)]
A B C
0 x w 0
3 q x 3
โปรดทราบว่าหากคุณต้องการค้นหาทุกคอลัมน์คุณเพียงแค่ข้ามขั้นตอนการเลือกคอลัมน์และทำ
df2.isin(c1).any(axis=1)
ในทำนองเดียวกันเมื่อต้องการเก็บแถวที่มีคอลัมน์ทั้งหมดTrue
ให้ใช้all
ในลักษณะเดียวกับก่อนหน้านี้
df2[df2[['A', 'B']].isin(c1).all(axis=1)]
A B C
0 x w 0
Notable Mentions: numpy.isin
,, query
list comprehensions (ข้อมูลสตริง)
นอกเหนือไปจากวิธีการที่อธิบายข้างต้นคุณยังสามารถใช้เทียบเท่า numpy.isin
numpy:
# `in` operation
df[np.isin(df['countries'], c1)]
countries
1 UK
4 China
# `not in` operation
df[np.isin(df['countries'], c1, invert=True)]
countries
0 US
2 Germany
3 NaN
ทำไมการพิจารณาถึงความคุ้มค่า ฟังก์ชั่น NumPy โดยปกติจะเร็วกว่าแพนด้าเทียบเท่าเพราะค่าใช้จ่ายที่ต่ำกว่า เนื่องจากนี่คือการดำเนินการ elementwise ที่ไม่ได้ขึ้นอยู่กับการจัดตำแหน่งดัชนีมีสถานการณ์น้อยมากที่วิธีการนี้ไม่ได้เป็นทดแทนที่เหมาะสมสำหรับหมีแพนด้าisin
โดยปกติแล้วงานประจำของ Pandas จะวนซ้ำเมื่อทำงานกับสตริงเนื่องจากการทำงานของสตริงนั้นยากต่อการ vectorise มีหลักฐานมากมายที่จะแนะนำว่ารายการความเข้าใจจะเร็วขึ้นที่นี่ . เราหันไปin
ตรวจสอบทันที
c1_set = set(c1) # Using `in` with `sets` is a constant time operation...
# This doesn't matter for pandas because the implementation differs.
# `in` operation
df[[x in c1_set for x in df['countries']]]
countries
1 UK
4 China
# `not in` operation
df[[x not in c1_set for x in df['countries']]]
countries
0 US
2 Germany
3 NaN
อย่างไรก็ตามมีความไม่แน่นอนมากที่จะระบุอย่างไรก็ตามอย่าใช้มันจนกว่าคุณจะรู้ว่าคุณกำลังทำอะไรอยู่
สุดท้ายนี้ยังDataFrame.query
มีคำตอบนี้อีกด้วย FTW numexpr!