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

2024-09-27 22:31:21 发布

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

这是一个数据帧,其中每列的前缀为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

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

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

有了这一点,我可以说{}是{},当{}中的值在{}到{}的范围内,当{}中的值在{}到{}的范围内时{}是{}

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

>>> 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

数据字典:

{'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}}

Tags: 数据代码dfwheremaxsconcagrcext
1条回答
网友
1楼 · 发布于 2024-09-27 22:31:21

您可以尝试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

相关问题 更多 >

    热门问题