ฉันมีสถานการณ์ที่ผู้ใช้ต้องการใช้ตัวกรองหลายตัวกับวัตถุ Pandas DataFrame หรือชุดข้อมูล โดยพื้นฐานแล้วฉันต้องการโยงกลุ่มการกรอง (การดำเนินการเปรียบเทียบ) เข้าด้วยกันอย่างมีประสิทธิภาพซึ่งระบุไว้ ณ เวลาใช้งานโดยผู้ใช้
ตัวกรองควรเป็นสารเติมแต่ง (รู้จักกันว่าตัวกรองแต่ละตัวที่ใช้ควรทำให้ผลลัพธ์แคบลง)
ขณะนี้ฉันกำลังใช้reindex()
แต่สิ่งนี้สร้างวัตถุใหม่ทุกครั้งและคัดลอกข้อมูลพื้นฐาน (ถ้าฉันเข้าใจเอกสารอย่างถูกต้อง) ดังนั้นสิ่งนี้อาจไม่มีประสิทธิภาพจริง ๆ เมื่อกรองชุดข้อมูลขนาดใหญ่หรือ DataFrame
ฉันคิดว่าการใช้apply()
, map()
หรือสิ่งที่คล้ายกันอาจจะดีกว่า ฉันค่อนข้างใหม่กับนุ่น แต่ก็ยังพยายามห่อหัวของฉันกับทุกสิ่ง
TL; DR
ฉันต้องการใช้พจนานุกรมของแบบฟอร์มต่อไปนี้และใช้การดำเนินการแต่ละอย่างกับวัตถุ Series ที่กำหนดและส่งคืนวัตถุซีรี่ส์ 'กรอง'
relops = {'>=': [1], '<=': [1]}
ตัวอย่างที่ยาวนาน
ฉันจะเริ่มต้นด้วยตัวอย่างของสิ่งที่ฉันมีในปัจจุบันและเพียงแค่กรองวัตถุชุดเดียว ด้านล่างเป็นฟังก์ชั่นที่ฉันใช้อยู่:
def apply_relops(series, relops):
"""
Pass dictionary of relational operators to perform on given series object
"""
for op, vals in relops.iteritems():
op_func = ops[op]
for val in vals:
filtered = op_func(series, val)
series = series.reindex(series[filtered])
return series
ผู้ใช้จัดเตรียมพจนานุกรมที่มีการดำเนินงานที่ต้องการดำเนินการ:
>>> df = pandas.DataFrame({'col1': [0, 1, 2], 'col2': [10, 11, 12]})
>>> print df
>>> print df
col1 col2
0 0 10
1 1 11
2 2 12
>>> from operator import le, ge
>>> ops ={'>=': ge, '<=': le}
>>> apply_relops(df['col1'], {'>=': [1]})
col1
1 1
2 2
Name: col1
>>> apply_relops(df['col1'], relops = {'>=': [1], '<=': [1]})
col1
1 1
Name: col1
อีกครั้ง 'ปัญหา' ด้วยวิธีการข้างต้นของฉันคือฉันคิดว่ามีจำนวนมากอาจคัดลอกข้อมูลที่ไม่จำเป็นสำหรับขั้นตอนในระหว่าง
นอกจากนี้ฉันต้องการขยายสิ่งนี้เพื่อให้พจนานุกรมที่ส่งผ่านสามารถรวมคอลัมน์ไปยังผู้ดำเนินการและกรอง DataFrame ทั้งหมดตามพจนานุกรมการป้อนข้อมูล อย่างไรก็ตามฉันสมมติว่าอะไรก็ตามที่ใช้ได้กับซีรีย์นั้นสามารถขยายไปยัง DataFrame ได้อย่างง่ายดาย
df.query
และpd.eval
ดูเหมือนจะเหมาะสำหรับกรณีการใช้งานของคุณ สำหรับข้อมูลเกี่ยวกับpd.eval()
ครอบครัวของฟังก์ชั่นคุณสมบัติของพวกเขาและกรณีการใช้งานกรุณาเยี่ยมแบบไดนามิกการแสดงออกในการประเมินผลโดยใช้หมีแพนด้า pd.eval ()