30个函数玩转Pandas统计计算!

2021-09-03 14:07:51 浏览数 (1)


大家好,我是才哥。

我在进行数据处理的时候除了清洗筛选处理外还会涉及到统计计算处理,这里我们就来介绍一些常见的统计计算函数吧。

1. 数据预览

本文案例演示数据来自国家数据中心的各地区最近5年的国民生产总值数据,后台回复gdp可以领取数据文件,方便自己试一试哈。

代码语言:javascript复制
In [1]: df.head() # 预览前5条数据
Out[1]: 
       地区    2020年    2019年    2018年    2017年    2016年
0     北京市  36102.6  35445.1  33106.0  29883.0  27041.2
1     天津市  14083.7  14055.5  13362.9  12450.6  11477.2
2     河北省  36206.9  34978.6  32494.6  30640.8  28474.1
3     山西省  17651.9  16961.6  15958.1  14484.3  11946.4
4  内蒙古自治区  17359.8  17212.5  16140.8  14898.1  13789.3

In [2]: df.info() # 查看各字段数据类型、条数及空值数
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 32 entries, 0 to 31
Data columns (total 6 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   地区      32 non-null     object 
 1   2020年   31 non-null     float64
 2   2019年   31 non-null     float64
 3   2018年   31 non-null     float64
 4   2017年   31 non-null     float64
 5   2016年   31 non-null     float64
dtypes: float64(5), object(1)
memory usage: 1.6  KB

2. 描述统计

describe函数方法 可以返回数据集的描述性统计

代码语言:javascript复制
Signature:
df.describe(
    percentiles=None,
    include=None,
    exclude=None,
    datetime_is_numeric=False,
) -> 'FrameOrSeries'
Docstring:
Generate descriptive statistics.

对于Dataframe类型来说,每行对应一个统计指标,分别是总数、平均值、标准差、最小值、四分位(默认是25/50/75)和最大值

代码语言:javascript复制
In [3]: df.describe()
Out[3]: 
               2020年          2019年         2018年         2017年         2016年
count      31.000000      31.000000     31.000000     31.000000     31.000000
mean    32658.551613   31687.758065  29487.661290  26841.819355  24224.148387
std     26661.811640   25848.652250  24136.181387  22161.575235  20008.278500
min      1902.700000    1697.800000   1548.400000   1349.000000   1173.000000
25%     13940.650000   13826.300000  13104.700000  12381.800000  11634.800000
50%     25115.000000   24667.300000  22716.500000  20210.800000  18388.600000
75%     42612.500000   41110.350000  37508.750000  33835.250000  30370.250000
max    110760.900000  107986.900000  99945.200000  91648.700000  82163.200000

上面的描述性统计表,我们可以看到2020年一共有31个地区有数据,GDP均值为3.26万亿,最高的11.07万亿,最低的0.19万亿等

我们可以看到,还有参数可以进行自定义选择,作用如下:

percentiles可以自定指定分位数

代码语言:javascript复制
In [4]: df.describe(percentiles=[.2, .4, .6, .8])
Out[4]: 
               2020年          2019年         2018年         2017年         2016年
count      31.000000      31.000000     31.000000     31.000000     31.000000
mean    32658.551613   31687.758065  29487.661290  26841.819355  24224.148387
std     26661.811640   25848.652250  24136.181387  22161.575235  20008.278500
min      1902.700000    1697.800000   1548.400000   1349.000000   1173.000000
20%     13698.500000   13544.400000  12809.400000  11159.900000  10427.000000
40%     22156.700000   21237.100000  19627.800000  17790.700000  16116.600000
50%     25115.000000   24667.300000  22716.500000  20210.800000  18388.600000
60%     36102.600000   34978.600000  32494.600000  29676.200000  26307.700000
80%     43903.900000   45429.000000  42022.000000  37235.000000  33138.500000
max    110760.900000  107986.900000  99945.200000  91648.700000  82163.200000

includeexclude分别指定和排除数据类型,比如

代码语言:javascript复制
df.describe(include=[np.number]) # 指定数字类型的字段
df.describe(exclude=[np.float]) # 排除浮点类型的字段

我们可以看到,默认情况下describe指定的都是数字类型的,地区字段部分的未参与,如果想参与可以通过include='all'来指定。

代码语言:javascript复制
In [5]: df.describe(include='all')
Out[5]: 
         地区      2020年      2019年     2018年     2017年     2016年
count    32      31.00      31.00     31.00     31.00     31.00
unique   32        NaN        NaN       NaN       NaN       NaN
top     北京市        NaN        NaN       NaN       NaN       NaN
freq      1        NaN        NaN       NaN       NaN       NaN
...     ...        ...        ...       ...       ...       ...
25%     NaN   13940.65   13826.30  13104.70  12381.80  11634.80
50%     NaN   25115.00   24667.30  22716.50  20210.80  18388.60
75%     NaN   42612.50   41110.35  37508.75  33835.25  30370.25
max     NaN  110760.90  107986.90  99945.20  91648.70  82163.20

[11 rows x 6 columns]

案例数据中,地区字段下的数据都是object类型,非数字相关。我们可以发现在描述统计结果中,它新增了uniquetopfrep三个指标,相反这三个指标对于纯数字类型的字段列是没有的。这三个指标分别对应非重复数最大值频率(如有重复的),比如下面这个单独案例:

代码语言:javascript复制
In [6]: s = pd.Series(['red','blue','black','grey','red','grey'])

In [7]: s.describe()
Out[7]: 
count       6
unique      4
top       red
freq        2
dtype: object

descripe函数中还有一个参数datetime_is_numeric,如果是对时间类型数据的统计描述需要赋值True

代码语言:javascript复制
In [8]: s = pd.Series([np.datetime64("2000-01-01"),
    ...:                np.datetime64("2010-01-01"),
    ...:                np.datetime64("2010-01-01")
    ...:                ])

In [9]: s.describe()
FutureWarning: Treating datetime data as categorical rather than numeric in `.describe` is deprecated and will be removed in a future version of pandas. Specify `datetime_is_numeric=True` to silence this warning and adopt the future behavior now.
  s.describe()
Out[9]: 
count                       3
unique                      2
top       2010-01-01 00:00:00
freq                        2
first     2000-01-01 00:00:00
last      2010-01-01 00:00:00
dtype: object

In [10]: s.describe(datetime_is_numeric=True)
Out[10]: 
count                      3
mean     2006-09-01 08:00:00
min      2000-01-01 00:00:00
25%      2004-12-31 12:00:00
50%      2010-01-01 00:00:00
75%      2010-01-01 00:00:00
max      2010-01-01 00:00:00
dtype: object

在我们日常数据处理中,除了描述统计里的这些统计维度外,我们还会用到其他一些统计计算,比如方差、众数等等。

3. 统计计算

这里我们演示常见的统计计算函数方法,默认情况下都是按列统计,我们也可以指定按行,具体见下方演示

代码语言:javascript复制
# 最大值
In [11]: df.max(numeric_only=True)
Out[11]: 
2020年    110760.9
2019年    107986.9
2018年     99945.2
2017年     91648.7
2016年     82163.2
dtype: float64

# 最小值
In [12]: df.min(numeric_only=True)
Out[12]: 
2020年    1902.7
2019年    1697.8
2018年    1548.4
2017年    1349.0
2016年    1173.0
dtype: float64

# 平均值 (统计项的计算,建议指定数据类型为仅数字,可以通过axis指定是行列,默认是列)
In [13]: df.mean(axis=1, numeric_only=True)
Out[13]: 
0     32315.58
1     13085.98
2     32559.00
3     15400.46
        ...   
28     2683.66
29     3432.18
30    12198.96
31         NaN
Length: 32, dtype: float64

以下部分不做具体演示,仅介绍函数功能,所有这些在使用的时候都要注意下原始数据类型,非数字类型可能会出现报错

代码语言:javascript复制
df.sum() # 求和
df.corr() # 相关系数
df.cov() # 协方差
df.count() # 非空计数
df.abs() # 绝对值
df.median() # 中位数
df.mode() # 众数
df.std() # 标准差
df.var() # 无偏方差
df.sem() # 均值的标准误差
df.mad() # 平均绝对差
df.prod() # 连乘
df.cumprod() # 累乘
df.cumsum() # 累加
df.nunique() # 非重复计数
df.idxmax() # 最大值索引名(注意是索引名,区别于argmax)
df.idxmin() # 最小值索引名
df.sample(5) # 随机抽样5条数据 
df.skew() # 样本偏度(第三阶)
df.kurt() # 样本偏度(第四阶)
df.quantile() # 样本分位数
df.rank() # 排名
df.pct_change() # 变化率
df.value_counts() # 不重复值及数量
s.argmax() # 最大值索引(自动索引),dataframe没有
s.argmin() # 最小值索引(自动索引),dataframe没有

其实,在每个函数中都有别的参数可以让函数功能更强大,具体大家可以自行尝试哈,我们这里简单举个别例子。

代码语言:javascript复制
>>> s = pd.Series([90, 91, 85])
>>> s
0    90
1    91
2    85
dtype: int64

>>> s.pct_change()
0         NaN
1    0.011111
2   -0.065934
dtype: float64

>>> s.pct_change(periods=2) # 隔2行求变化率(默认是隔1行)
0         NaN
1         NaN
2   -0.055556
dtype: float64

除了上述这些函数外,以下几个函数我们也常用到

代码语言:javascript复制
# 某列最大的前5行数据
In [14]: df.nlargest(5,columns='2020年')
Out[14]: 
     地区     2020年     2019年    2018年    2017年    2016年
18  广东省  110760.9  107986.9  99945.2  91648.7  82163.2
9   江苏省  102719.0   98656.8  93207.6  85869.8  77350.9
14  山东省   73129.0   70540.5  66648.9  63012.1  58762.5
10  浙江省   64613.3   62462.0  58002.8  52403.1  47254.0
15  河南省   54997.1   53717.8  49935.9  44824.9  40249.3

# 某列最小的前五行数据
In [15]: df.nsmallest(5,columns='2020年')
Out[15]: 
         地区   2020年   2019年   2018年   2017年   2016年
25    西藏自治区  1902.7  1697.8  1548.4  1349.0  1173.0
28      青海省  3005.9  2941.1  2748.0  2465.1  2258.2
29  宁夏回族自治区  3920.5  3748.5  3510.2  3200.3  2781.4
20      海南省  5532.4  5330.8  4910.7  4497.5  4090.2
27      甘肃省  9016.7  8718.3  8104.1  7336.7  6907.9

加减乘除四则运算等

可以用运算符号,也可以用函数方法;同样可以传一个值,也可以传一个DataFrameSerice

代码语言:javascript复制
'''
Among flexible wrappers 
(`add`, `sub`, `mul`, `div`, `mod`, `pow`) 
to arithmetic 
operators: 
` `, `-`, `*`, `/`, `//`, `%`, `**`.
'''
df   1
df.add(1)

以上就是本次全部内容,感兴趣的小伙伴可以自己跑一跑代码试试,或者添加作者微信一起交流哦!

0 人点赞