Python数据分析

Python数据分析 知识量:13 - 56 - 232

8.3 汇总计算><

非空值计数- 8.3.1 -

可以通过count()函数计算DataFrame数据对象中每列的非空数值的个数。

import pandas as pd
df=pd.read_excel(r"D:\PythonTestFile\exam_nan.xlsx")
print(df,'\n')
print(df.count())

运行结果为:

       Name     Sex  Chinese  English  Math
0      Noah    male     90.0     50.0  66.0
1      Emma     NaN     56.0     56.0  55.0
2       NaN     NaN      NaN      NaN   NaN
3    Olivia  female     86.0     87.0   NaN
4      Liam    male     55.0      NaN  69.0
5    Sophia  female     90.0     66.0  96.0
6      Liam    male     55.0      NaN  69.0
7  Isabella  female      NaN     85.0  55.0 

Name       7
Sex        6
Chinese    6
English    5
Math       6
dtype: int64

此外,还可以查看每一行或每一列的非空数值个数:

import pandas as pd
df=pd.read_excel(r"D:\PythonTestFile\exam_nan.xlsx")
print(df,'\n')
print(df.count(axis=1),'\n')  # 每一行的非空数值个数
print(df.Chinese.count())  # Chinese列的非空数值个数

运行结果为:

       Name     Sex  Chinese  English  Math
0      Noah    male     90.0     50.0  66.0
1      Emma     NaN     56.0     56.0  55.0
2       NaN     NaN      NaN      NaN   NaN
3    Olivia  female     86.0     87.0   NaN
4      Liam    male     55.0      NaN  69.0
5    Sophia  female     90.0     66.0  96.0
6      Liam    male     55.0      NaN  69.0
7  Isabella  female      NaN     85.0  55.0 

0    5
1    4
2    0
3    4
4    4
5    5
6    4
7    4
dtype: int64 

6

求和- 8.3.2 -

可以通过sum()函数计算数据表每一列的求和结果。

import pandas as pd
df=pd.read_excel(r"D:\PythonTestFile\exam_new.xlsx")
print(df,'\n')
print(df.sum())

运行结果为:

       Name     Sex  Chinese  English  Math
0      Noah    male       90       50    66
1      Emma  female       56       56    55
2       Bob    male       99       84    89
3    Olivia  female       86       87    44
4      Jeff    male       48       87    65
5      Liam    male       55       88    69
6    Sophia  female       90       66    96
7  Isabella  female       66       85    55 

Name        NoahEmmaBobOliviaJeffLiamSophiaIsabella
Sex        malefemalemalefemalemalemalefemalefemale
Chinese                                         590
English                                         603
Math                                            539
dtype: object

以上示例中,对于非数值型列(Name和Sex)也进行了简单的求和(拼接)。

除了对全部数据进行求和外,可以设置axis=1,来对每一行进行求和操作。还可以对某一行或某一列进行求和。

import pandas as pd
df=pd.read_excel(r"D:\PythonTestFile\exam_new.xlsx")
print(df,'\n')
print(df.sum(axis=1),'\n')  # 计算每一行的和
print(df.iloc[2,2:].sum(),'\n')  # 计算第2行第2到4列的和
print(df.Chinese.sum())  # 计算Chinese列的和

运行结果为:

       Name     Sex  Chinese  English  Math
0      Noah    male       90       50    66
1      Emma  female       56       56    55
2       Bob    male       99       84    89
3    Olivia  female       86       87    44
4      Jeff    male       48       87    65
5      Liam    male       55       88    69
6    Sophia  female       90       66    96
7  Isabella  female       66       85    55 

0    206
1    167
2    272
3    217
4    200
5    212
6    252
7    206
dtype: int64 

272 

590

计算每一行的和时自动忽略非数值项。

求平均值- 8.3.3 -

可以利用mean()函数求平均值。当对整个DataFrame数据表使用mean()函数时,将返回每一列的平均值:

import pandas as pd
df=pd.read_excel(r"D:\PythonTestFile\exam_new.xlsx")
print(df,'\n')
print(df.mean())

运行结果为:

       Name     Sex  Chinese  English  Math
0      Noah    male       90       50    66
1      Emma  female       56       56    55
2       Bob    male       99       84    89
3    Olivia  female       86       87    44
4      Jeff    male       48       87    65
5      Liam    male       55       88    69
6    Sophia  female       90       66    96
7  Isabella  female       66       85    55 

Chinese    73.750
English    75.375
Math       67.375
dtype: float64

从以上示例可以看出,对整个数据表求平均值时,默认只计算数值型数据。

可以通过设置参数axis=1,来对每一行求平均值。也可以索引出某一行或某一列,单独求平均值。

import pandas as pd
df=pd.read_excel(r"D:\PythonTestFile\exam_new.xlsx")
print(df,'\n')
print(df.mean(axis=1),'\n')  # 计算每一行的平均值
print(df.iloc[2,2:].mean(),'\n')  # 计算第2行第2到4列的平均值
print(df.Chinese.mean())  # 计算Chinese列的平均值

运行结果为:

       Name     Sex  Chinese  English  Math
0      Noah    male       90       50    66
1      Emma  female       56       56    55
2       Bob    male       99       84    89
3    Olivia  female       86       87    44
4      Jeff    male       48       87    65
5      Liam    male       55       88    69
6    Sophia  female       90       66    96
7  Isabella  female       66       85    55 

0    68.666667
1    55.666667
2    90.666667
3    72.333333
4    66.666667
5    70.666667
6    84.000000
7    68.666667
dtype: float64 

90.66666666666667 

73.75

求最大值和最小值- 8.3.4 -

使用max()函数求最大值,使用min()函数求最小值。对整个DataFrame数据表使用时,返回的是每一列的最大值和最小值,也可以对每一行、某一行、某一列求最大值和最小值。

import pandas as pd
df=pd.read_excel(r"D:\PythonTestFile\exam_new.xlsx")
print(df,'\n')
print('****************************************')
print(df.max(),'\n')  # 计算每一列的最大值
print(df.max(axis=1),'\n')  # 计算每一行的最大值
print(df.iloc[2,2:].max(),'\n')  # 计算第2行第2到4列的最大值
print(df.Chinese.max(),'\n')  # 计算Chinese列的最大值
print('****************************************')
print(df.min(),'\n')  # 计算每一列的最小值
print(df.min(axis=1),'\n')  # 计算每一行的最小值
print(df.iloc[2,2:].min(),'\n')  # 计算第2行第2到4列的最小值
print(df.Chinese.min())  # 计算Chinese列的最小值

运行结果为:

       Name     Sex  Chinese  English  Math
0      Noah    male       90       50    66
1      Emma  female       56       56    55
2       Bob    male       99       84    89
3    Olivia  female       86       87    44
4      Jeff    male       48       87    65
5      Liam    male       55       88    69
6    Sophia  female       90       66    96
7  Isabella  female       66       85    55 

****************************************
Name       Sophia
Sex          male
Chinese        99
English        88
Math           96
dtype: object 

0    90
1    56
2    99
3    87
4    87
5    88
6    96
7    85
dtype: int64 

99 

99 

****************************************
Name          Bob
Sex        female
Chinese        48
English        50
Math           44
dtype: object 

0    50
1    55
2    84
3    44
4    48
5    55
6    66
7    55
dtype: int64 

84 

48

求中位数- 8.3.5 -

当一组数列从小到大排列,位于中间位置的数即是中位数。Python中,使用median()函数来求中位数。

import pandas as pd
df=pd.read_excel(r"D:\PythonTestFile\exam_new.xlsx")
print(df,'\n')
print(df.median(),'\n')  # 计算每一列的中位数
print(df.median(axis=1),'\n')  # 计算每一行的中位数
print(df.iloc[2,2:].median(),'\n')  # 计算第2行第2到4列的中位数
print(df.Chinese.median())  # 计算Chinese列的中位数

运行结果为:

       Name     Sex  Chinese  English  Math
0      Noah    male       90       50    66
1      Emma  female       56       56    55
2       Bob    male       99       84    89
3    Olivia  female       86       87    44
4      Jeff    male       48       87    65
5      Liam    male       55       88    69
6    Sophia  female       90       66    96
7  Isabella  female       66       85    55 

Chinese    76.0
English    84.5
Math       65.5
dtype: float64 

0    66.0
1    56.0
2    89.0
3    86.0
4    65.0
5    69.0
6    90.0
7    66.0
dtype: float64 

89.0 

76.0

求分位数- 8.3.6 -

在排序后的一组数值中,分位数基于位置给出该组数值的指标。分位数可分为四分之一位数、四分之二位数、四分之三位数。其中,四分之二位数即是中位数。Python中,使用quantile()函数来求分位数,需要通过参数给出分位数值。

import pandas as pd
df=pd.read_excel(r"D:\PythonTestFile\exam_new.xlsx",usecols=[2,3,4])
print(df,'\n')
print(df.quantile(0.25),'\n')  # 计算每一列的四分之一位数
print(df.quantile(0.25,axis=1),'\n')  # 计算每一行的四分之一位数
print(df.iloc[1].quantile(0.75),'\n')  # 计算第1行的四分之三位数
print(df.Chinese.quantile(0.75))  # 计算Chinese列的四分之三位数

运行结果为:

   Chinese  English  Math
0       90       50    66
1       56       56    55
2       99       84    89
3       86       87    44
4       48       87    65
5       55       88    69
6       90       66    96
7       66       85    55 

Chinese    55.75
English    63.50
Math       55.00
Name: 0.25, dtype: float64 

0    58.0
1    55.5
2    86.5
3    65.0
4    56.5
5    62.0
6    78.0
7    60.5
Name: 0.25, dtype: float64 

56.0 

90.0

求众数- 8.3.7 -

众数就是一组数值中出现次数最多的数。Python中,使用mode()函数来求众数。

import pandas as pd
df=pd.read_excel(r"D:\PythonTestFile\exam_new.xlsx",usecols=[2,3,4])
print(df,'\n')
print(df.mode(),'\n')  # 计算每一列的众数
print(df.mode(axis=1),'\n')  # 计算每一行的众数
print(df.iloc[1].mode(),'\n')  # 计算第1行的众数
print(df.Chinese.mode())  # 计算Chinese列的众数

运行结果为:

   Chinese  English  Math
0       90       50    66
1       56       56    55
2       99       84    89
3       86       87    44
4       48       87    65
5       55       88    69
6       90       66    96
7       66       85    55 

   Chinese  English  Math
0       90       87    55 

      0     1     2
0  50.0  66.0  90.0
1  56.0   NaN   NaN
2  84.0  89.0  99.0
3  44.0  86.0  87.0
4  48.0  65.0  87.0
5  55.0  69.0  88.0
6  66.0  90.0  96.0
7  55.0  66.0  85.0 

0    56
dtype: int64 

0    90
dtype: int64

求方差- 8.3.8 -

Python中,使用var()函数来求方差。

import pandas as pd
df=pd.read_excel(r"D:\PythonTestFile\exam_new.xlsx",usecols=[2,3,4])
print(df,'\n')
print(df.var(),'\n')  # 计算每一列的方差
print(df.var(axis=1),'\n')  # 计算每一行的方差
print(df.iloc[1].var(),'\n')  # 计算第1行的方差
print(df.Chinese.var())  # 计算Chinese列的方差

运行结果为:

   Chinese  English  Math
0       90       50    66
1       56       56    55
2       99       84    89
3       86       87    44
4       48       87    65
5       55       88    69
6       90       66    96
7       66       85    55 

Chinese    386.500000
English    243.410714
Math       307.125000
dtype: float64 

0    405.333333
1      0.333333
2     58.333333
3    602.333333
4    382.333333
5    274.333333
6    252.000000
7    230.333333
dtype: float64 

0.33333333333333337 

386.5

求标准差- 8.3.9 -

Python中,使用std()函数来求标准差。

import pandas as pd
df=pd.read_excel(r"D:\PythonTestFile\exam_new.xlsx",usecols=[2,3,4])
print(df,'\n')
print(df.std(),'\n')  # 计算每一列的标准差
print(df.std(axis=1),'\n')  # 计算每一行的标准差
print(df.iloc[1].std(),'\n')  # 计算第1行的标准差
print(df.Chinese.std())  # 计算Chinese列的标准差

运行结果为:

   Chinese  English  Math
0       90       50    66
1       56       56    55
2       99       84    89
3       86       87    44
4       48       87    65
5       55       88    69
6       90       66    96
7       66       85    55 

Chinese    19.659603
English    15.601625
Math       17.524982
dtype: float64 

0    20.132892
1     0.577350
2     7.637626
3    24.542480
4    19.553346
5    16.563011
6    15.874508
7    15.176737
dtype: float64 

0.5773502691896258 

19.6596032513375