使用 Pandas 从另一列中查找满足条件的值范围

时间:2021-02-16 15:09:58

标签: python pandas

这是数据框,其中每列都有一个前缀 cs

c 代表一个班级(是或否),s 代表与该班级相关的分数。

     cAGR cCON cEXT cNEU cOPN  sAGR  sCON  sEXT  sNEU  sOPN
2157    y    y    y    n    y  4.17  3.67  4.33  2.00  4.40
2422    y    n    y    n    y  3.95  3.25  4.20  2.60  5.00
2741    y    n    n    n    y  4.00  3.00  2.75  2.50  4.75
2884    y    y    y    n    y  3.55  3.95  3.75  2.05  3.80
4830    n    n    n    y    y  3.05  3.05  3.40  2.80  4.35
4932    y    n    n    y    y  3.85  3.10  2.75  3.65  3.80
5611    y    n    n    n    y  3.65  3.25  2.80  1.60  4.15
5743    n    y    n    y    n  3.35  4.25  3.30  2.80  3.50
6360    y    y    n    y    y  3.85  4.35  3.20  3.60  4.80
6822    y    y    y    n    y  4.50  3.50  4.13  1.43  4.13

我试图根据它是同一类中的sAGR还是yn)来获取列(cAGR)中的最小和最大分数这样我就可以知道在正类或负类中的最小或最大分数是多少,即这些值的范围。

例如,在下面的代码中,我获得了 y 中值 ncAGR 的最大值和最小值。

有了这个,我可以说 cAGRysAGR 中的值在 3.554.5 的范围内并且 {{1当 cAGR 中的值在 nsAGR 的范围内时,}} 为 3.05

下面的代码足够了,但它确实是重复的,我想知道是否有更好的方法来做到这一点?

3.35

数据字典:

>>> df['sAGR'].where(df['cAGR'] == 'y').max()
4.5
>>> df['sAGR'].where(df['cAGR'] == 'y').min()
3.55
>>> df['sAGR'].where(df['cAGR'] == 'n').min()
3.05
>>> df['sAGR'].where(df['cAGR'] == 'n').max()
3.35

1 个答案:

答案 0 :(得分:5)

你可以试试groupby

df.groupby('cAGR')['sAGR'].agg(['min','max'])

输出:

       min   max
cAGR            
n     3.05  3.35
y     3.55  4.50

奖励如果您想使用其他后缀,请尝试pd.wide_to_long

(pd.wide_to_long(df.reset_index(), i='index',
                stubnames=['c','s'], j='cat',
                suffix='.*' )
   .groupby(['cat','c'])['s'].agg(['min','max'])
)

输出:

        min   max
cat c            
AGR n  3.05  3.35
    y  3.55  4.50
CON n  3.00  3.25
    y  3.50  4.35
EXT n  2.75  3.40
    y  3.75  4.33
NEU n  1.43  2.60
    y  2.80  3.65
OPN n  3.50  3.50
    y  3.80  5.00
相关问题