Pandas:数据分析与处理

·  阅读 376

1. 分组分析

分组分析是指根据分组字段将分析对象划分成不同的部分,以对比分析各组之间差异性的一种分析方法。 常用的统计指标有:计数,求和,平均值。

常用命令形式如下: df.groupby(by=['分类1','分类2',...])['被统计的列'].agg({列名1:统计函数1, 列名2:统计函数2,...})

参数说明:

  • by 表示用于分组的列
  • [] 表示用于统计的列
  • .agg 表示统计别名显示统计值的名称,统计函数用于统计数据。常用的统计函数有:size表示计数, sum表示求和, mean表示求均值。
import numpy as np
from pandas import read_excel

df = read_excel(r'/Users/nxcjh/lianjia/log/project/pylearn/examples/i_nuc.xls', sheet_name='Sheet7')
print(df.head())

print(df.groupby('班级')['军训','英语','体育','性别'].mean())

'''
    groupby可将列名直接当作分组对象,分组中,数值列会被聚合,非数值列会从结果中排除,当by不止一个分组对象(列名)时,需要使用list。
'''

print(df.groupby(['班级','性别'])['军训'].agg({'总分':np.sum, '人数':np.size, '平均值':np.mean, '方差':np.var, '标准差':np.std, '最高分':np.max, '最低分': np.min}))

复制代码
           学号        班级  姓名 性别  英语  体育  军训  数分  高代  解几
0  2308024241  23080242  成龙  男  76  78  77  40  23  60
1  2308024244  23080242  周怡  女  66  91  75  47  47  44
2  2308024251  23080242  张波  男  85  81  75  45  45  60
3  2308024249  23080242  朱浩  男  65  50  80  72  62  71
4  2308024219  23080242  封印  女  73  88  92  61  47  46
                 军训         英语         体育
班级                                       
23080242  81.333333  70.833333  73.000000
23080243  85.500000  71.000000  60.666667
23080244  64.375000  75.000000  75.375000
              总分  人数        平均值           方差        标准差  最高分  最低分
班级       性别                                                      
23080242167   2  83.500000   144.500000  12.020815   92   75321   4  80.250000    38.250000   6.184658   89   75
23080243258   3  86.000000    12.000000   3.464102   90   84255   3  85.000000     1.000000   1.000000   86   84
2308024493   2  46.500000  4324.500000  65.760931   93    0422   6  70.333333  1211.866667  34.811875   91    0


/anaconda3/lib/python3.6/site-packages/ipykernel_launcher.py:13: FutureWarning: using a dict on a Series for aggregation
is deprecated and will be removed in a future version
  del sys.path[0]
复制代码

2. 分布分析

分布分析是指根据分析的目的,将数据(定量数据)进行等距或不等距的分组,研究各组分布规律的一种分析方法。

import numpy as np
from pandas import read_excel
import pandas as pd

df = read_excel(r'/Users/nxcjh/lianjia/log/project/pylearn/examples/i_nuc.xls', sheet_name='Sheet7')

df['总分'] = df.英语+df.体育+df.军训+df.数分+df.高代+df.解几

# print(df.head())
# print(df['总分'].describe())

bins = [min(df.总分)-1, 400, 450, max(df.总分)+1]
labels = ['400分及以下','400到500','500分及以上']

df_n = pd.cut(df.总分, bins, labels=labels)
df['分类'] = df_n
print(df)



复制代码
            学号        班级   姓名 性别  英语  体育  军训  数分  高代  解几   总分       分类
0   2308024241  23080242   成龙  男  76  78  77  40  23  60  354  400分及以下
1   2308024244  23080242   周怡  女  66  91  75  47  47  44  370  400分及以下
2   2308024251  23080242   张波  男  85  81  75  45  45  60  391  400分及以下
3   2308024249  23080242   朱浩  男  65  50  80  72  62  71  400  400分及以下
4   2308024219  23080242   封印  女  73  88  92  61  47  46  407  400到500
5   2308024201  23080242   迟培  男  60  50  89  71  76  71  417  400到500
6   2308024347  23080243   李华  女  67  61  84  61  65  78  416  400到500
7   2308024307  23080243   陈田  男  76  79  86  69  40  69  419  400到500
8   2308024326  23080243   余皓  男  66  67  85  65  61  71  415  400到500
9   2308024320  23080243   李嘉  女  62   0  90  60  67  77  356  400分及以下
10  2308024342  23080243  李上初  男  76  90  84  60  66  60  436  400到500
11  2308024310  23080243   郭窦  女  79  67  84  64  64  79  437  400到500
12  2308024435  23080244  姜毅涛  男  77  71   0  61  73  76  358  400分及以下
13  2308024432  23080244   赵宇  男  74  74  88  68  70  71  445  400到500
14  2308024446  23080244   周路  女  76  80   0  61  74  80  371  400分及以下
15  2308024421  23080244  林建祥  男  72  72  81  63  90  75  453  500分及以上
16  2308024433  23080244  李大强  男  79  76  77  78  70  70  450  400到500
17  2308024428  23080244  李侧通  男  64  96  91  69  60  77  457  500分及以上
18  2308024402  23080244   王慧  女  73  74  93  70  71  75  456  500分及以上
19  2308024422  23080244  李晓亮  男  85  60  85  72  72  83  457  500分及以上
复制代码
print(df.groupby(by=['分类'])['学号'].agg({'人数':np.size}))
复制代码
         人数
分类         
400分及以下   7
400500   9
500分及以上   4


/anaconda3/lib/python3.6/site-packages/ipykernel_launcher.py:1: FutureWarning: using a dict on a Series for aggregation
is deprecated and will be removed in a future version
  """Entry point for launching an IPython kernel.
复制代码

3. 交叉分析

交叉分析通常用于分析两个或两个以上分组变量之间的关系,以交叉表形式进行变量间关系的对比分析。

一般分为定量, 定量分组交叉;定量,定性分组交叉;定性,定性分组交叉。 常用命令格式如下:

pivot_table(values, index, columns, aggfunc, fill_value)

参数说明:

  • values:表示数据透视表中的值;
  • index:表示数据透视表中的行;
  • columns:表示数据透视表中的列;
  • aggfunc:表示统计函数;
  • fill_value:表示NA值的统一替换。
  • 返回值:透视表中的结果。
from pandas import pivot_table
from pandas import read_excel
import pandas as pd
import numpy as np


df = read_excel(r'/Users/nxcjh/lianjia/log/project/pylearn/examples/i_nuc.xls', sheet_name='Sheet7')

print(df.head())


复制代码
           学号        班级  姓名 性别  英语  体育  军训  数分  高代  解几
0  2308024241  23080242  成龙  男  76  78  77  40  23  60
1  2308024244  23080242  周怡  女  66  91  75  47  47  44
2  2308024251  23080242  张波  男  85  81  75  45  45  60
3  2308024249  23080242  朱浩  男  65  50  80  72  62  71
4  2308024219  23080242  封印  女  73  88  92  61  47  46
复制代码
print(df.pivot_table(index=['班级','姓名'])) #对所有的数据进行透视。
复制代码
              体育  军训          学号   总分  数分  英语  解几  高代
班级       姓名                                          
23080242 周怡   91  75  2308024244  370  47  66  44  47
         封印   88  92  2308024219  407  61  73  46  47
         张波   81  75  2308024251  391  45  85  60  45
         成龙   78  77  2308024241  354  40  76  60  23
         朱浩   50  80  2308024249  400  72  65  71  62
         迟培   50  89  2308024201  417  71  60  71  76
23080243 余皓   67  85  2308024326  415  65  66  71  61
         李上初  90  84  2308024342  436  60  76  60  66
         李华   61  84  2308024347  416  61  67  78  65
         李嘉    0  90  2308024320  356  60  62  77  67
         郭窦   67  84  2308024310  437  64  79  79  64
         陈田   79  86  2308024307  419  69  76  69  40
23080244 周路   80   0  2308024446  371  61  76  80  74
         姜毅涛  71   0  2308024435  358  61  77  76  73
         李侧通  96  91  2308024428  457  69  64  77  60
         李大强  76  77  2308024433  450  78  79  70  70
         李晓亮  60  85  2308024422  457  72  85  83  72
         林建祥  72  81  2308024421  453  63  72  75  90
         王慧   74  93  2308024402  456  70  73  75  71
         赵宇   74  88  2308024432  445  68  74  71  70
复制代码
print(df.pivot_table(['军训','英语','体育','性别'],index=['班级','姓名'])) #选取部分列进行透视
复制代码
              体育  军训  英语
班级       姓名             
23080242 周怡   91  75  66
         封印   88  92  73
         张波   81  75  85
         成龙   78  77  76
         朱浩   50  80  65
         迟培   50  89  60
23080243 余皓   67  85  66
         李上初  90  84  76
         李华   61  84  67
         李嘉    0  90  62
         郭窦   67  84  79
         陈田   79  86  76
23080244 周路   80   0  76
         姜毅涛  71   0  77
         李侧通  96  91  64
         李大强  76  77  79
         李晓亮  60  85  85
         林建祥  72  81  72
         王慧   74  93  73
         赵宇   74  88  74
复制代码
df['总分'] = df.英语+df.体育+df.军训+df.数分+df.高代+df.解几

bins = [min(df.总分)-1, 400, 450, max(df.总分)+1]
labels = ['400分及以下','400到500','500分及以上']

df['分类'] = pd.cut(df.总分, bins, labels=labels)


print(df.pivot_table(values=['总分'],index=['分类'], columns=['性别'], aggfunc=[np.size, np.mean]))



复制代码
        size           mean            
          总分             总分            
性别         女  男           女           男
分类                                     
400分及以下    3  4  365.666667  375.750000
400500    3  6  420.000000  430.333333
500分及以上    1  3  456.000000  455.666667
复制代码

4. 结构分析

结构分析是在分组分析以及交叉分析的基础上,计算各组成部分所占的比重,进而分析总体的内部特征的一种分析方法。

这里分组主要是指定性分组,定性分组一般看结构,它的重点在于计算各组成部分占总体的比重。

参数 axis说明:

  • 0 表示对列操作
  • 1 表示对行操作
import numpy as np
import pandas as pd
from pandas import read_excel
from pandas import pivot_table


df = read_excel(r'/Users/nxcjh/lianjia/log/project/pylearn/examples/i_nuc.xls', sheet_name='Sheet7')
df['总分'] = df.英语+df.体育+df.军训+df.数分+df.高代+df.解几

df_ptr = df.pivot_table(values=['总分'],index=['班级'],columns=['性别'],aggfunc=[np.sum])

print(df_ptr.sum(axis=1)) #按照列合并
复制代码
班级
23080242    2339
23080243    2479
23080244    3447
dtype: int64
复制代码
print(df_ptr.sum(axis=0)) #按照行操作
复制代码
         性别
sum  总分       2813
              5452
dtype: int64
复制代码
print(df_ptr.div(df_ptr.sum(axis=1),axis=0)) #按照列占比
复制代码
               sum          
                总分          
性别               女         男
班级                          
23080242  0.332193  0.667807
23080243  0.487697  0.512303
23080244  0.239919  0.760081
复制代码
print(df_ptr.div(df_ptr.sum(axis=0),axis=1)) #按照行占比
复制代码
               sum          
                总分          
性别               女         男
班级                          
23080242  0.276218  0.286500
23080243  0.429790  0.232942
23080244  0.293992  0.480558
复制代码
分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改