ฉันทำการค้นหาบางอย่างแล้วและไม่สามารถหาวิธีกรองดาต้าเฟรมได้df["col"].str.contains(word)
แต่ฉันสงสัยว่ามีวิธีการย้อนกลับหรือไม่: กรองดาต้าเฟรมตามคำชมของชุดนั้น !(df["col"].str.contains(word))
เช่นผลกระทบของ
สามารถทำได้ด้วยDataFrame
วิธีการหรือไม่?
ฉันทำการค้นหาบางอย่างแล้วและไม่สามารถหาวิธีกรองดาต้าเฟรมได้df["col"].str.contains(word)
แต่ฉันสงสัยว่ามีวิธีการย้อนกลับหรือไม่: กรองดาต้าเฟรมตามคำชมของชุดนั้น !(df["col"].str.contains(word))
เช่นผลกระทบของ
สามารถทำได้ด้วยDataFrame
วิธีการหรือไม่?
คำตอบ:
คุณสามารถใช้ตัวดำเนินการ invert (~) (ซึ่งทำหน้าที่เหมือนไม่ใช่ข้อมูลบูลีน):
new_df = df[~df["col"].str.contains(word)]
ซึ่งnew_df
เป็นสำเนาที่ส่งกลับโดย RHS
นอกจากนี้ยังยอมรับนิพจน์ทั่วไป ...
หากด้านบนแสดง ValueError สาเหตุน่าจะเป็นเพราะคุณมีประเภทข้อมูลผสมกันดังนั้นให้ใช้na=False
:
new_df = df[~df["col"].str.contains(word, na=False)]
หรือ,
new_df = df[df["col"].str.contains(word) == False]
df[~df.col.str.contains(word)]
ส่งคืนสำเนาของดาต้าเฟรมเดิมที่มีแถวที่ยกเว้นที่ตรงกับคำนั้น
ฉันมีปัญหากับสัญลักษณ์ not (~) เช่นกันดังนั้นนี่เป็นอีกวิธีหนึ่งจากเธรด 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]
เหรอ? ขอบคุณ!
df = df[~df["col"].str.contains('\|')]
คุณสามารถใช้ Apply และ Lambda เพื่อเลือกแถวที่คอลัมน์มีสิ่งใด ๆ ในรายการ สำหรับสถานการณ์ของคุณ:
df[df["col"].apply(lambda x:x not in [word1,word2,word3])]
ฉันต้องกำจัดค่า NULL ก่อนที่จะใช้คำสั่งที่ Andy แนะนำข้างต้น ตัวอย่าง:
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'
ฉันกำจัดค่า NULL โดยใช้ dropna () หรือ fillna () ก่อนและลองคำสั่งอีกครั้งโดยไม่มีปัญหา
~df["second"].astype(str).str.contains(word)
str
ดูstackoverflow.com/questions/43568760/…
ฉันหวังว่าคำตอบจะโพสต์แล้ว
ผมเพิ่มกรอบที่จะหาคำหลายคำและลบล้างผู้ที่มาจาก dataFrame
นี่'word1','word2','word3','word4'
= รายการรูปแบบที่ต้องการค้นหา
df
= DataFrame
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)]
เพิ่มเติมสำหรับคำตอบของ nanselm2 คุณสามารถใช้0
แทนFalse
:
df["col"].str.contains(word)==0
NaN
re.complies
และบอกตัวเองว่าฉันจะไปที่นั่นในภายหลัง ดูเหมือนว่าฉันจะเกินการค้นหาและก็เป็นอย่างที่คุณพูด