这是数据框,其中每列都有一个前缀 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
我试图根据它是同一类中的sAGR
还是y
(n
)来获取列(cAGR
)中的最小和最大分数这样我就可以知道在正类或负类中的最小或最大分数是多少,即这些值的范围。
例如,在下面的代码中,我获得了 y
中值 n
和 cAGR
的最大值和最小值。
有了这个,我可以说 cAGR
是 y
当 sAGR
中的值在 3.55
到 4.5
的范围内并且 {{1当 cAGR
中的值在 n
到 sAGR
的范围内时,}} 为 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
答案 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