Python pandas数据帧的平均值和绘图值

时间:2017-05-24 10:58:13

标签: python pandas numpy

我已经实现了Kfold-cross验证算法来研究机器学习问题并设置SVM的参数(我知道skilearn但我想自己执行算法)。我创建了5个折叠,我用它来测试SVM参数'C'和'tollerance'。 我将结果保存在一个文本文件中,然后我用这样的Pandas创建了一个Dataframe:

           C      tol  FP   TN     SPE   TP  FN     SEN
0        100  0.10000  19  261  0.9469  107   6  0.9321
1        100  0.10000  30  250  0.8319   94  19  0.8929
2        100  0.10000  28  252  0.8496   96  17  0.9000
3        100  0.10000  27  253  0.9735  110   3  0.9036
4        100  0.10000  26  254  0.9469  107   6  0.9071
5        100  0.05000  16  264  0.9381  106   7  0.9429
6        100  0.05000  22  258  0.8319   94  19  0.9214
7        100  0.05000  25  255  0.8761   99  14  0.9107
8        100  0.05000  21  259  0.9646  109   4  0.9250
9        100  0.05000  20  260  0.9823  111   2  0.9286

.......
400  1000000  0.00001  21  259  0.9558  108   5  0.9250
401  1000000  0.00001  20  260  0.8850  100  13  0.9286
402  1000000  0.00001  14  266  0.8584   97  16  0.9500
403  1000000  0.00001  17  263  0.9558  108   5  0.9393
404  1000000  0.00001  23  257  0.9735  110   3  0.9179

它有405行。 我需要计算“SPE”和“SEN”列中每组5个元素的平均值,然后在整个数据帧中迭代整个过程(例如,我需要计算列'SPE'元素的平均值在行0:4中的'SEN',而不是在5:9中,而不是在10:14 ......直到行400:404)。 对于每次迭代,我想获得一个具有以下值的矩阵:

['C', 'tol' , 'mean of SPE', 'mean of SEN']

矩阵将有405/5 = 81行和4列。

因此对于上面的Dataframe部分,我想要一个结果链接:

[[100, 0.10000, 0.90976, 0.90714],
 [100,0.05000, 0.91860, 0.92572]]
.....
[1000000,0.00001,0.91860, 0.92572]

我想获得这个矩阵,因为我的目标是使用pyplot获得2个图:一个用于变量'SPE'对'tol',一个用于变量'SEN'对''tol'用于绘制每个值的不同曲线'C'。
感谢

1 个答案:

答案 0 :(得分:1)

使用<div class="row" *ngIf="errors && errors.length"> <div class="col-md-12"> <div class="alert alert-danger alert-dismissible"> <a href="#" class="close" data-dismiss="alert" aria-label="close">&times;</a> <ol *ngFor="let err of errMsg"> <li>{{ err }}</li> </ol> </div> </div> </div> 由{div}创建的arange first meandf = df.groupby(np.arange(len(df.index)) // 5) \ .agg({'C':'first', 'tol':'first', 'SPE':'mean','SEN':'mean'}) \ .reindex_axis(['C','tol','SPE','SEN'], axis=1) \ .rename(columns = {'SPE':'mean of SPE','SEN':'mean of SEN'}) print (df) C tol mean of SPE mean of SEN 0 100 0.10000 0.90976 0.90714 1 100 0.05000 0.91860 0.92572 2 1000000 0.00001 0.92570 0.93216 groupby用于列的更改顺序:

df1 = df.pivot(index='mean of SPE', columns='tol', values='C')
print (df1)
tol            0.00001  0.05000  0.10000
mean of SPE                             
0.90976            NaN      NaN    100.0
0.91860            NaN    100.0      NaN
0.92570      1000000.0      NaN      NaN

可以使用agg + reindex_axis

进行绘图
df1 = df.pivot(index='C', columns='tol', values='mean of SPE')
print (df1)
tol      0.00001  0.05000  0.10000
C                                 
100          NaN   0.9186  0.90976
1000000   0.9257      NaN      NaN

df1.plot()

或者也许:

df = df.groupby(np.arange(len(df.index)) // 5) \
       .agg({'C':'first', 'tol':'first', 'SPE':'mean','SEN':'mean'}) \
       .reindex_axis(['C','tol','SPE','SEN'], axis=1) \
       .values
print (df)
[[  1.00000000e+02   1.00000000e-01   9.09760000e-01   9.07140000e-01]
 [  1.00000000e+02   5.00000000e-02   9.18600000e-01   9.25720000e-01]
 [  1.00000000e+06   1.00000000e-05   9.25700000e-01   9.32160000e-01]]

对于numpy数组添加pivot

df

编辑:

如果每5行的容差值是唯一的,groupby的解决方案可能略有不同 - tolarange而不是df = df.groupby('tol', sort=False) \ .agg({'C':'first', 'SPE':'mean','SEN':'mean'}) \ .reset_index() \ .reindex_axis(['C','tol','SPE','SEN'], axis=1) \ .rename(columns = {'SPE':'mean of SPE','SEN':'mean of SEN'}) print (df) C tol mean of SPE mean of SEN 0 100 0.10000 0.90976 0.90714 1 100 0.05000 0.91860 0.92572 2 1000000 0.00001 0.92570 0.93216

ALTER TABLE