पांडा में डेटाफ़्रेम पर "करता है-शामिल नहीं" के लिए खोजें


142

मैंने कुछ खोज की है और डेटाफ़्रेम को फ़िल्टर करने के तरीके का पता नहीं लगा सकता df["col"].str.contains(word), हालाँकि मैं सोच रहा हूँ कि क्या रिवर्स करने का कोई तरीका है: डेटाफ़्रेम को उस सेट की तारीफ से फ़िल्टर करें। उदा: के प्रभाव के लिए !(df["col"].str.contains(word))

क्या यह एक DataFrameविधि के माध्यम से किया जा सकता है ?

जवाबों:


264

आप इनवर्टर (~) ऑपरेटर (जो बूलियन डेटा के लिए नहीं की तरह काम करता है) का उपयोग कर सकते हैं:

new_df = df[~df["col"].str.contains(word)]

, कहाँ पे new_df आरएचएस द्वारा लौटी गई प्रति है।

इसमें एक नियमित अभिव्यक्ति भी शामिल है ...


यदि ऊपर एक मान को फेंकता है, तो इसका कारण संभावना है क्योंकि आपके पास मिश्रित डेटाैटिप्स हैं, इसलिए उपयोग करें na=False:

new_df = df[~df["col"].str.contains(word, na=False)]

या,

new_df = df[df["col"].str.contains(word) == False]

1
उत्तम! मैं एसक्यूएल से परिचित हूं रेक्स से और सोचा था कि यह पायथन में अलग था - बहुत सारे लेखों को देखा re.compliesऔर खुद से कहा कि मैं बाद में इसे प्राप्त करूंगा। ऐसा लगता है कि मैंने खोज को ओवरफिट कर दिया है और जैसा कि आप कहते हैं कि यह है
:)

6
शायद एक पूर्ण उदाहरण सहायक होगा: df[~df.col.str.contains(word)]शब्द से मेल खाते बहिष्कृत पंक्तियों के साथ मूल डेटाफ्रेम की एक प्रति लौटाता है।
डेनिस गोलोमेज़ोव

45

मैं (~) प्रतीक के रूप में अच्छी तरह से परेशानी हो रही थी, इसलिए यहाँ दूसरे से एक और तरीका है StackOverflow धागे :

df[df["col"].str.contains('this|that')==False]

क्या इसे इस तरह जोड़ा जा सकता है? df[df["col1"].str.contains('this'|'that')==False and df["col2"].str.contains('foo'|'bar')==True]? धन्यवाद!
tommy.carstensen

हाँ तुम कर सकते हो। वाक्यविन्यास यहाँ समझाया गया है: stackoverflow.com/questions/22086116/…
tommy.carstensen

यह नहीं भूलना चाहिए कि यदि हम पंक्तियों को बदलना चाहते हैं जिसमें "" | हमें "\" का उपयोग करना चाहिए df = df[~df["col"].str.contains('\|')]
अमीर

9

आप उन पंक्तियों का चयन करने के लिए अप्लाई और लैम्बडा का उपयोग कर सकते हैं जहाँ किसी सूची में किसी भी चीज़ का कॉलम होता है। आपके परिदृश्य के लिए:

df[df["col"].apply(lambda x:x not in [word1,word2,word3])]

6

ऊपर एंडी द्वारा अनुशंसित कमांड का उपयोग करने से पहले मुझे NULL मूल्यों से छुटकारा पाना था। एक उदाहरण:

df = pd.DataFrame(index = [0, 1, 2], columns=['first', 'second', 'third'])
df.ix[:, 'first'] = 'myword'
df.ix[0, 'second'] = 'myword'
df.ix[2, 'second'] = 'myword'
df.ix[1, 'third'] = 'myword'
df

    first   second  third
0   myword  myword   NaN
1   myword  NaN      myword 
2   myword  myword   NaN

अब कमांड चला रहे हैं:

~df["second"].str.contains(word)

मुझे निम्नलिखित त्रुटि मिलती है:

TypeError: bad operand type for unary ~: 'float'

मैं पहली बार dropna () या fillna () का उपयोग करके NULL मानों से छुटकारा पा गया और बिना किसी समस्या के कमांड को वापस ले लिया।


1
आप ~df["second"].astype(str).str.contains(word)रूपांतरण को बल देने के लिए भी उपयोग कर सकते हैं str। देखें stackoverflow.com/questions/43568760/...
डेविड सी

1
@ सूरेश हम इस समस्या के समाधान के रूप में na = गलत का उपयोग भी कर सकते हैं
विस्वास गुप्ता

5

मुझे उम्मीद है कि उत्तर पहले से ही पोस्ट किए गए हैं

मैं कई शब्दों को खोजने और डेटाफ़्रेम से उन लोगों को नकारने के लिए रूपरेखा जोड़ रहा हूं

यहाँ 'word1','word2','word3','word4' = खोज करने के लिए प्रतिमानों की सूची

df = डाटाफ्रेम

column_a = DataFrame df से एक कॉलम नाम

Search_for_These_values = ['word1','word2','word3','word4'] 

pattern = '|'.join(Search_for_These_values)

result = df.loc[~(df['column_a'].str.contains(pattern, case=False)]

3

Nanselm2 के उत्तर के अतिरिक्त, आप 0इसके स्थान पर उपयोग कर सकते हैं False:

df["col"].str.contains(word)==0

ऐसा लगता है कि यह भी किसी भी पंक्तियों को हटा देंNaN
bshelt141
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.