在Python中,有没有直接的方法来过滤pd.数据帧以列的两个值范围为条件?

2024-03-28 17:17:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我得到了一个简单的数据帧:

df
Out[102]: 
         0        1
0   nfp_zb  0.04325
1   ftb_zb  0.05645
2   ftb_cl  0.09055
3     cl_2  0.12865
4   ftb_gc  0.13385
5     cl_1  0.22795
6     cl_3  0.26985
7     es_3  0.37955
8     es_2  0.39450
9     zb_3  0.42170
10    es_1  0.45170
11  nfp_es  0.47190
12    zb_2  0.50130
13  nfp_cl  0.53170
14  nfp_gc  0.74260
15    gc_2  0.76640
16    gc_3  0.80915
17    zb_1  0.83010
18    gc_1  0.89795

我所要做的就是选择大于阈值a的值和小于阈值b的值,这两个值的范围是不重叠的。想象一下(大于85%和小于15%)。显然,这两个条件都是独立的。所以我是这样做的:

def filter(df):
    df['filter'] = ""
    df.loc[df[1] > 0.85, 'filter'] = 1
    df.loc[df[1] < 0.15, 'filter'] = 1
    df = df[df['filter'] == 1]
    del df['filter']
    return df

我得到了正确的答案:

filter(df)
Out[104]: 
         0        1 
0   nfp_zb  0.04325       
1   ftb_zb  0.05645      
2   ftb_cl  0.09055      
3     cl_2  0.12865      
4   ftb_gc  0.13385      
18    gc_1  0.89795   

但是,我想知道是否有一个直接的方法来做到这一点,而不创建自定义公式。也许是使用groupby。。。。你知道吗

谢谢你的帮助


Tags: 数据dfescldef阈值filterout
3条回答

你可以试试测向查询在熊猫v0.13中添加了

import pandas as pd
df = pd.read_clipboard()
df

         A        B
0   nfp_zb  0.04325
1   ftb_zb  0.05645
2   ftb_cl  0.09055
3     cl_2  0.12865
4   ftb_gc  0.13385
5     cl_1  0.22795
6     cl_3  0.26985
7     es_3  0.37955
8     es_2  0.39450
9     zb_3  0.42170
10    es_1  0.45170
11  nfp_es  0.47190
12    zb_2  0.50130
13  nfp_cl  0.53170
14  nfp_gc  0.74260
15    gc_2  0.76640
16    gc_3  0.80915
17    zb_1  0.83010
18    gc_1  0.89795

df.query('B > 0.85 or B < 0.15')

您只需将所有条件放入.loc访问器中,用or运算符分隔:

df.loc[(df['1'] > 0.85) | (df['1'] < 0.15), :]
Out[19]: 
         0        1
0   nfp_zb  0.04325
1   ftb_zb  0.05645
2   ftb_cl  0.09055
3     cl_2  0.12865
4   ftb_gc  0.13385
18    gc_1  0.89795

人们在其他答案中给出的建议应该同样有效,你只需翻转不平等,使用or而不是and。你知道吗

你可能想用布尔掩蔽。你知道吗

mask1 = df['1'] > .85
mask2 = df['1'] < .15

filtered = df[mask1 | mask2]

相关问题 更多 >