Python 使用Pandas从另一列中查找填充条件的值范围
这是数据帧,其中每列的前缀为Python 使用Pandas从另一列中查找填充条件的值范围,python,pandas,Python,Pandas,这是数据帧,其中每列的前缀为c或s 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
c
或s
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
我试图根据同一类(cAGR
)中的y
或n
)来获得列(sAGR
)中的最小和最大分数,以便我能够知道正类或负类中的最小或最大分数,即这些值的范围
例如,在下面的代码中,我得到了cAGR
中y
和n
值的最大值和最小值
因此,当sAGR
中的值在3.55
到4.5
范围内时,我可以说cAGR
是y
,当sAGR
中的值在3.05
到3.35
范围内时,cAGR
是n
下面的代码已经足够了,但它确实是重复的,我想知道是否有更好的方法来做到这一点
>>> 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}}
您可以尝试
groupby
:
df.groupby('cAGR')['sAGR'].agg(['min','max'])
输出:
min max
cAGR
n 3.05 3.35
y 3.55 4.50
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
Bonus如果您想使用其他后缀,请尝试使用
pd.wide\u to\u 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
cAGR
n 3.05 3.35
y 3.55 4.50
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
谢谢,奖金答案正是我想要的!