ค้นหา“ ไม่มี - ไม่มี” บน DataFrame ในแพนด้า


156

ฉันทำการค้นหาบางอย่างแล้วและไม่สามารถหาวิธีกรองดาต้าเฟรมได้df["col"].str.contains(word)แต่ฉันสงสัยว่ามีวิธีการย้อนกลับหรือไม่: กรองดาต้าเฟรมตามคำชมของชุดนั้น !(df["col"].str.contains(word))เช่นผลกระทบของ

สามารถทำได้ด้วยDataFrameวิธีการหรือไม่?

คำตอบ:


295

คุณสามารถใช้ตัวดำเนินการ 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]

1
สมบูรณ์แบบ! ฉันคุ้นเคยกับ SQL กับ regex และคิดว่ามันแตกต่างจาก Python - เห็นบทความมากมายre.compliesและบอกตัวเองว่าฉันจะไปที่นั่นในภายหลัง ดูเหมือนว่าฉันจะเกินการค้นหาและก็เป็นอย่างที่คุณพูด
:)

6
ตัวอย่างทั้งหมดอาจเป็นประโยชน์: df[~df.col.str.contains(word)]ส่งคืนสำเนาของดาต้าเฟรมเดิมที่มีแถวที่ยกเว้นที่ตรงกับคำนั้น
Dennis Golomazov

50

ฉันมีปัญหากับสัญลักษณ์ 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]เหรอ? ขอบคุณ!
tommy.carstensen

ใช่คุณสามารถ. อธิบายไวยากรณ์ได้ที่นี่: stackoverflow.com/questions/22086116/…
tommy.carstensen

อย่าลืมว่าถ้าเราต้องการ rwmove แถวที่มี "|" เราควรใช้ "\" like df = df[~df["col"].str.contains('\|')]
Amir

9

คุณสามารถใช้ Apply และ Lambda เพื่อเลือกแถวที่คอลัมน์มีสิ่งใด ๆ ในรายการ สำหรับสถานการณ์ของคุณ:

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

6

ฉันต้องกำจัดค่า 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 () ก่อนและลองคำสั่งอีกครั้งโดยไม่มีปัญหา


1
นอกจากนี้คุณยังสามารถใช้เพื่อบังคับให้การแปลง~df["second"].astype(str).str.contains(word) strดูstackoverflow.com/questions/43568760/…
David C

1
@Shoresh เราสามารถใช้ na = False เป็นวิธีแก้ปัญหานี้ได้
Vishav Gupta

5

ฉันหวังว่าคำตอบจะโพสต์แล้ว

ผมเพิ่มกรอบที่จะหาคำหลายคำและลบล้างผู้ที่มาจาก 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)]

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.