ฉันกำลังกรองแถวในดาต้าเฟรมตามค่าในสองคอลัมน์
ด้วยเหตุผลบางประการตัวดำเนินการ OR มีพฤติกรรมเหมือนที่ฉันคาดหวังให้ตัวดำเนินการ AND ทำงานและในทางกลับกัน
รหัสทดสอบของฉัน:
import pandas as pd
df = pd.DataFrame({'a': range(5), 'b': range(5) })
# let's insert some -1 values
df['a'][1] = -1
df['b'][1] = -1
df['a'][3] = -1
df['b'][4] = -1
df1 = df[(df.a != -1) & (df.b != -1)]
df2 = df[(df.a != -1) | (df.b != -1)]
print pd.concat([df, df1, df2], axis=1,
keys = [ 'original df', 'using AND (&)', 'using OR (|)',])
และผลลัพธ์:
original df using AND (&) using OR (|)
a b a b a b
0 0 0 0 0 0 0
1 -1 -1 NaN NaN NaN NaN
2 2 2 2 2 2 2
3 -1 3 NaN NaN -1 3
4 4 -1 NaN NaN 4 -1
[5 rows x 6 columns]
ในขณะที่คุณสามารถดูที่ผู้ประกอบการลดลงแถวในที่อย่างน้อยหนึ่งค่าเท่ากับทุกAND
-1
ในทางกลับกันOR
โอเปอเรเตอร์ต้องการให้ทั้งสองค่าเท่ากันจึง-1
จะปล่อยทิ้งได้ ฉันคาดหวังผลลัพธ์ที่ตรงกันข้าม ใครช่วยอธิบายพฤติกรรมนี้ได้ไหม
ฉันใช้แพนด้า 0.13.1
df.query
และpd.eval
ดูเหมือนจะเหมาะกับกรณีการใช้งานนี้ สำหรับข้อมูลเกี่ยวกับpd.eval()
ครอบครัวของฟังก์ชั่นคุณสมบัติของพวกเขาและกรณีการใช้งานกรุณาเยี่ยมแบบไดนามิกการแสดงออกในการประเมินผลโดยใช้หมีแพนด้า pd.eval ()