โซลูชันนี้มีการแฮ็กมากกว่าในแง่ของการใช้งาน แต่ฉันคิดว่ามันสะอาดกว่าในแง่ของการใช้งานและแน่นอนกว่าวิธีอื่น ๆ ที่เสนอโดยทั่วไป
https://github.com/toobaz/generic_utils/blob/master/generic_utils/pandas/where.py
คุณไม่จำเป็นต้องดาวน์โหลด repo ทั้งหมด: บันทึกไฟล์และทำ
from where import where as W
ควรจะพอเพียง จากนั้นคุณใช้มันเช่นนี้:
df = pd.DataFrame([[1, 2, True],
[3, 4, False],
[5, 7, True]],
index=range(3), columns=['a', 'b', 'c'])
# On specific column:
print(df.loc[W['a'] > 2])
print(df.loc[-W['a'] == W['b']])
print(df.loc[~W['c']])
# On entire - or subset of a - DataFrame:
print(df.loc[W.sum(axis=1) > 3])
print(df.loc[W[['a', 'b']].diff(axis=1)['b'] > 1])
ตัวอย่างการใช้งานที่โง่น้อยลงเล็กน้อย:
data = pd.read_csv('ugly_db.csv').loc[~(W == '$null$').any(axis=1)]
โดยวิธีการ: แม้ในกรณีที่คุณใช้บูลีนบูล
df.loc[W['cond1']].loc[W['cond2']]
สามารถมีประสิทธิภาพมากกว่า
df.loc[W['cond1'] & W['cond2']]
เพราะมันจะประเมินcond2
เฉพาะในกรณีที่cond1
เป็นTrue
เป็น
การปฏิเสธความรับผิด: ฉันให้คำตอบแรกนี้ที่อื่นเพราะฉันไม่ได้เห็นสิ่งนี้
df.query
และpd.eval
ดูเหมือนจะเหมาะสำหรับกรณีการใช้งานนี้ สำหรับข้อมูลเกี่ยวกับpd.eval()
ครอบครัวของฟังก์ชั่นคุณสมบัติของพวกเขาและกรณีการใช้งานกรุณาเยี่ยมแบบไดนามิกการแสดงออกในการประเมินผลโดยใช้หมีแพนด้า pd.eval ()