कैसे एक पांडा डेटा के लिए 'में' और 'नहीं' को लागू करने के लिए?
पांडा प्रस्तावों दो तरीकों: Series.isin
और DataFrame.isin
सीरीज और DataFrames, क्रमशः के लिए।
एक कॉलम के आधार पर डेटाफ़्रेम फ़िल्टर करें (यह श्रृंखला पर भी लागू होता है)
isin
डेटाफ़्रेम में पंक्तियों को फ़िल्टर करने के लिए सबसे आम परिदृश्य एक विशिष्ट कॉलम पर एक शर्त लागू कर रहा है।
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
मैनी कॉलम पर फ़िल्टर करें
कभी-कभी, आप कई कॉलमों में कुछ खोज शब्दों के साथ 'इन' सदस्यता जांच लागू करना चाहेंगे।
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
उल्लेखनीय उल्लेख करता है: numpy.isin
, query
, सूची comprehensions (स्ट्रिंग डेटा)
ऊपर वर्णित विधियों के अतिरिक्त, आप सुन्न समकक्ष का भी उपयोग कर सकते हैं numpy.isin
:।
# `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
यह विचार करने लायक क्यों है? लोअरहेड के कारण नंबरी फंक्शन आमतौर पर अपने पंडों के समकक्षों की तुलना में थोड़ा तेज होते हैं। चूंकि यह एक एलिमेंट वाइज ऑपरेशन है जो इंडेक्स अलाइनमेंट पर निर्भर नहीं करता है, ऐसे बहुत कम परिस्थितियां हैं जहां यह विधि पांडा के लिए एक उपयुक्त प्रतिस्थापन नहीं है isin
। '
स्ट्रिंग्स के साथ काम करते समय पंडों की दिनचर्या आम तौर पर पुनरावृत्त होती है, क्योंकि स्ट्रिंग ऑपरेशन को वेक्टर करना मुश्किल होता है। यह समझने के लिए बहुत सारे सबूत हैं कि सूची की समझ यहाँ और तेज़ होगी। । हम 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
में भी कवर किया गया है । numexpr FTW!