简体   繁体   中英

Filter dataframe with multiple conditions including OR

I wrote a little script that loops through constraints to filter a dataframe. Example and follow up explaining the issue are below.

constraints = [['stand','==','L'],['zone','<','20']]
    
for x in constraints:
    vari = x[2]
    df = df.query("{0} {1} @vari".format(x[0],x[1]))
zone stand speed type
0 2 L 83.7 CH
1 7 L 95.9 SI
2 14 L 94.9 FS
3 11 L 93.3 FS
4 13 L 86.9 CH
5 7 L 96.4 SI
6 13 L 82.6 SL

I can't figure out a way to filter when there is an OR condition. For example, in the table above I'd like to return a dataframe using the constraints in the code example along with any rows that contain SI or CH in the type column. Does anyone have ideas on how to accomplish this? Any help would be greatly appreciated.

This seems to have gotten the job done but there is probably a much better way of going about it.

for x in constraints:
    vari = x[2]
    if isinstance(vari,list):
        frame = frame[frame[x[0]].isin(vari)]
    else:          
        frame = frame.query("{0} {1} @vari".format(x[0],x[1]))

IIUC (see my question in the comment) you can do it like this:

Made a little different df to show you the result (I guess the table you show is already filtered)

df = pd.DataFrame(
    {'zone': {0: 2, 1: 11, 2: 25, 3: 11, 4: 23, 5: 7, 6: 13},
     'stand': {0: 'L', 1: 'L', 2: 'L', 3: 'C', 4: 'L', 5: 'K', 6: 'L'},
     'speed': {0: 83.7, 1: 95.9, 2: 94.9, 3: 93.3, 4: 86.9, 5: 96.4, 6: 82.6},
     'type': {0: 'CH', 1: 'SI', 2: 'FS', 3: 'FS', 4: 'CH', 5: 'SI', 6: 'SL'}})
print(df)


    zone    stand   speed   type
0      2        L    83.7     CH
1     11        L    95.9     SI
2     25        L    94.9     FS
3     11        C    93.3     FS
4     23        L    86.9     CH
5      7        K    96.4     SI
6     13        L    82.6     SL


res = df.loc[ ( (df['type']=='SI') | (df['type']=='CH') ) & ( (df['zone']<20) & (df['stand']=='L') ) ]
print(res)


    zone    stand   speed   type
0      2        L    83.7     CH
1     11        L    95.9     SI

Let me know if that is what you are searching for.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM