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

yud*_*esh 2 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
Run Code Online (Sandbox Code Playgroud)

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

例如,在下面的代码中,我得到了值ynin的最大值和最小值cAGR

有了这个,我可以说,cAGRy当值sAGR在范围内3.55,以4.5cAGRn当值sAGR处于的范围3.053.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
Run Code Online (Sandbox Code Playgroud)

数据字典:

{'cAGR': {2157: 'y',
  2422: 'y',
  2741: 'y',
  2884: 'y',
  4830: 'n',
  4932: 'y',
  5611: 'y',
  5743: 'n',
  6360: 'y',
  6822: 'y'},
 'cCON': {2157: 'y',
  2422: 'n',
  2741: 'n',
  2884: 'y',
  4830: 'n',
  4932: 'n',
  5611: 'n',
  5743: 'y',
  6360: 'y',
  6822: 'y'},
 'cEXT': {2157: 'y',
  2422: 'y',
  2741: 'n',
  2884: 'y',
  4830: 'n',
  4932: 'n',
  5611: 'n',
  5743: 'n',
  6360: 'n',
  6822: 'y'},
 'cNEU': {2157: 'n',
  2422: 'n',
  2741: 'n',
  2884: 'n',
  4830: 'y',
  4932: 'y',
  5611: 'n',
  5743: 'y',
  6360: 'y',
  6822: 'n'},
 'cOPN': {2157: 'y',
  2422: 'y',
  2741: 'y',
  2884: 'y',
  4830: 'y',
  4932: 'y',
  5611: 'y',
  5743: 'n',
  6360: 'y',
  6822: 'y'},
 'sAGR': {2157: 4.17,
  2422: 3.95,
  2741: 4.0,
  2884: 3.55,
  4830: 3.05,
  4932: 3.85,
  5611: 3.65,
  5743: 3.35,
  6360: 3.85,
  6822: 4.5},
 'sCON': {2157: 3.67,
  2422: 3.25,
  2741: 3.0,
  2884: 3.95,
  4830: 3.05,
  4932: 3.1,
  5611: 3.25,
  5743: 4.25,
  6360: 4.35,
  6822: 3.5},
 'sEXT': {2157: 4.33,
  2422: 4.2,
  2741: 2.75,
  2884: 3.75,
  4830: 3.4,
  4932: 2.75,
  5611: 2.8,
  5743: 3.3,
  6360: 3.2,
  6822: 4.13},
 'sNEU': {2157: 2.0,
  2422: 2.6,
  2741: 2.5,
  2884: 2.05,
  4830: 2.8,
  4932: 3.65,
  5611: 1.6,
  5743: 2.8,
  6360: 3.6,
  6822: 1.43},
 'sOPN': {2157: 4.4,
  2422: 5.0,
  2741: 4.75,
  2884: 3.8,
  4830: 4.35,
  4932: 3.8,
  5611: 4.15,
  5743: 3.5,
  6360: 4.8,
  6822: 4.13}}
Run Code Online (Sandbox Code Playgroud)

Qua*_*ang 5

你可以试试groupby

df.groupby('cAGR')['sAGR'].agg(['min','max'])
Run Code Online (Sandbox Code Playgroud)

输出:

       min   max
cAGR            
n     3.05  3.35
y     3.55  4.50
Run Code Online (Sandbox Code Playgroud)

奖金,如果你想与其他后缀的话,试试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'])
)
Run Code Online (Sandbox Code Playgroud)

输出:

        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
Run Code Online (Sandbox Code Playgroud)