Series第七讲 计算/描述统计(上)
本节课将讲解Pandas-Series的计算/描述统计,由于接口过多,将分为上下两讲分别进行说明介绍。
计算/描述统计(上)
Series.abs()
Series.all()
Series.any()
Series.autocorr()
Series.between()
Series.clip()
Series.corr()
Series.count()
Series.cov()
Series.cummax()
Series.cummin()
Series.cumprod()
Series.cumsum()
Series.describe()
Series.diff()
Series.factorize()
Series.kurt()
Series.mad()
Series.max()
Series.min()
Series.mean()
Series.median()
详细介绍
首先导入所需依赖包
In [1]: import numpy as np
In [2]: import pandas as pd
1. Series.abs()
Series.abs()
对每个value求绝对值,注意⚠️:该方法仅适用于值全为数字元素的Series或DataFrame。
In [7]: pd.Series([1, 2, 3, -4]).abs()
Out[7]:
0 1
1 2
2 3
3 4
dtype: int64
In [8]: df = pd.DataFrame({
...: 'a': [4, 5, 6, 7],
...: 'b': [10, 20, 30, 40],
...: 'c': [100, 50, -30, -50]
...: })
In [9]: df.abs()
Out[9]:
a b c
0 4 10 100
1 5 20 50
2 6 30 30
3 7 40 50
2. Series.all()
Series.all(axis=0, bool_only=None, skipna=True, level=None, **kwargs)
元素全为True返回True,否则返回False。(DataFrame沿轴计算)。
常用参数介绍:
- axis:{0 or ‘index’, 1 or ‘columns’, None}, default 0 【作用轴,针对DataFrame】
- 0/‘index’:返回索引是列标签的Series
- 1/‘columns’:返回索引是行标签的Series
- None:作用于所有的轴,返回一个标量
- skipna:bool, default True 【跳过NaN值】
In [11]: pd.Series([True, False]).all()
Out[11]: False
In [12]: pd.Series([True, None]).all()
Out[12]: True
In [19]: df = pd.DataFrame({'col1': [True, True], 'col2': [True, False]})
In [20]: df.all()
Out[20]:
col1 True
col2 False
dtype: bool
In [21]: df.all(axis=1)
Out[21]:
0 True
1 False
dtype: bool
In [22]: df.all(axis=None)
Out[22]: False
3. Series.any()
Series.any(axis=0, bool_only=None, skipna=True, level=None, **kwargs)
至少有一个元素为True就返回True,否则返回False。参数同all()方法。
In [28]: pd.Series([True, False]).any()
Out[28]: True
In [29]: pd.Series([False, False]).any()
Out[29]: False
4. Series.autocorr()
Series.autocorr(lag=1)
求Series的自相关
常用参数介绍:
- lag:int, default 1 【执行自相关之前要应用的滞后次数】
In [32]: c_s = pd.Series([0.25, 0.5, 0.2, -0.05])
In [33]: c_s.autocorr()
Out[33]: 0.1035526330902407
# 实现原理其实就是如下,下面两个方法后面都会介绍到
In [35]: c_s.corr(c_s.shift(1))
Out[35]: 0.1035526330902407
5. Series.between()
Series.between(left, right, inclusive=True)
表示每个元素是否在左右之间(包括左和右)的Series。等效于 (left <= ser) & (ser <= right)
。
注意⚠️:只能数字与数字、str与str比较。
常用参数介绍:
- inclusive:bool, default True 【是否包含边界值】
In [42]: c_s.between(0.24, 0.50)
Out[42]:
0 True
1 True
2 False
3 False
dtype: bool
In [43]: (0.24 <= c_s) & (c_s <= 0.50)
Out[43]:
0 True
1 True
2 False
3 False
dtype: bool
6. Series.clip()
Series.clip(lower=None, upper=None, axis=None, inplace=False, *args, **kwargs)
修剪数据。小于lower的值替换为lower;大于upper的值替换为upper。
同样int与int比较,str与str比较。
常用参数介绍:
- lower:float or array_like, default None
In [47]: pd.Series(['a', 'b', 'c', 'd', 'e', 'f']).clip('b', 'd')
Out[47]:
0 b
1 b
2 c
3 d
4 d
5 d
dtype: object
In [49]: c_s.clip(0.20, 0.25)
Out[49]:
0 0.25
1 0.25
2 0.20
3 0.20
dtype: float64
# 应用array_like类型
In [50]: t = pd.Series([2, -4, -1, 6, 3])
In [51]: df = pd.DataFrame({'col_0': [9, -3, 0, -1, 5], 'col_1': [-2, -7, 6, 8, -5]})
In [52]: df.clip(t, t + 4, axis=0)
Out[52]:
col_0 col_1
0 6 2
1 -3 -4
2 0 3
3 6 8
4 5 3
clip.png
7. Series.corr()
Series.corr(other, method='pearson', min_periods=None)
计算两个Series的相关性,排除缺失值。
常用参数介绍:
- method:{‘pearson’, ‘kendall’, ‘spearman’} or callable 【计算相关性的方法】
- pearson:标准相关系数
- kendall:Kendall Tau相关系数
- Spearman:Spearman等级相关
- callable:输入两个1d ndarray并返回浮点数的可调用对象
In [56]: def histogram_intersection(a, b):
...: v = np.minimum(a, b).sum().round(decimals=1)
...: return v
In [57]: s1 = pd.Series([.2, .0, .6, .2])
...: s2 = pd.Series([.3, .6, .0, .1])
...: s1.corr(s2, method=histogram_intersection)
Out[57]: 0.3
8. Series.count()
Series.count(level=None)
返回Series中非空值的数量
In [59]: s = pd.Series([0.0, 1.0, np.nan])
In [60]: s.count()
Out[60]: 2
9. Series.cov()
Series.cov(other, min_periods=None, ddof=1)
计算Series的协方差,排除缺失值。
In [58]: s1 = pd.Series([0.90010907, 0.13484424, 0.62036035])
...: s2 = pd.Series([0.12528585, 0.26962463, 0.51111198])
...: s1.cov(s2)
Out[58]: -0.01685762652715874
10. Series.cummax()
Series.cummax(axis=None, skipna=True, *args, **kwargs)
沿轴计算累积最大值。
In [61]: pd.Series([2, np.nan, 5, -1, 0]).cummax()
Out[61]:
0 2.0
1 NaN
2 5.0
3 5.0
4 5.0
dtype: float64
11. Series.cummin()
Series.cummin(axis=None, skipna=True, *args, **kwargs)
沿轴计算累积最小值。
In [62]: pd.Series([2, np.nan, 5, -1, 0]).cummin()
Out[62]:
0 2.0
1 NaN
2 2.0
3 -1.0
4 -1.0
dtype: float64
12. Series.cumprod()
Series.cumprod(axis=None, skipna=True, *args, **kwargs)
沿轴计算累积相乘。
In [63]: pd.Series([2, np.nan, 5, -1, 0]).cumprod()
Out[63]:
0 2.0
1 NaN
2 10.0
3 -10.0
4 -0.0
dtype: float64
13. Series.cumsum()
Series.cumsum(axis=None, skipna=True, *args, **kwargs)
沿轴计算累积相加。
In [64]: pd.Series([2, np.nan, 5, -1, 0]).cumsum()
Out[64]:
0 2.0
1 NaN
2 7.0
3 6.0
4 6.0
dtype: float64
14. Series.describe()
Series.describe(percentiles=None, include=None, exclude=None, datetime_is_numeric=False)
生成描述性统计信息.
常用参数介绍:
- percentiles:list-like of numbers, optional 【包含在输出中的百分比。所有值都应介于0和1之间。默认为返回第25、50和75个百分位数。
[.25, .5, .75]
】 - include:‘all’, list-like of dtypes or None (default), optional 【要包括在结果中的数据类型的白名单,该参数只对DataFrame有效】
- ‘all’: All columns of the input will be included in the output 【包含全部类型列】
- A list-like of dtypes: Limits the results to the provided data types 【自定义类型列表】
- None (default): The result will include all numeric columns 【仅包含全部数值类型列】
- exclude:list-like of dtypes or None (default), optional 【要从结果中忽略的数据类型】
- datetime_is_numeric:bool, default False 【是否将datetime dtypes视为数字类型】
# 描述一个数值型的Series
In [65]: s = pd.Series([1, 2, 3])
...: s.describe()
Out[65]:
count 3.0
mean 2.0
std 1.0
min 1.0
25% 1.5
50% 2.0
75% 2.5
max 3.0
dtype: float64
# 描述一个str型的Series
In [66]: s = pd.Series(['a', 'a', 'b', 'c'])
...: s.describe()
Out[66]:
count 4
unique 3
top a
freq 2
dtype: object
# 描述一个时间戳的Series
In [70]: s = pd.Series([
...: np.datetime64("2000-01-01"),
...: np.datetime64("2010-01-01"),
...: np.datetime64("2010-01-01")
...: ])
...: s.describe()
Out[70]:
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
15. Series.diff()
Series.diff(periods=1)
计算当前元素与自己的第前periods的差值,periods可以为负数(负数时与后第periods比较)。
In [72]: s = pd.Series([1, 1, 2, 3, 5, 8])
...: s.diff()
Out[72]:
0 NaN
1 0.0
2 1.0
3 1.0
4 2.0
5 3.0
dtype: float64
16. Series.factorize()
Series.factorize(sort=False, na_sentinel=-1)
将对象编码为枚举(enumerated)类型或分类(categorical)变量。
常用参数介绍:
- sort:bool, default False 【是否将返回值进行排序 uniques的排序优先级高】
- na_sentinel:int or None, default -1 【如何标记NaN值,注意⚠️ uniques默认不会包含缺失值。如果需要pandas中包含NaN,可以设置na_sentinel为None】
返回值介绍:
- codes:ndarray 【An integer ndarray,是uniques的索引器】
- uniques:ndarray, Index, or Categorical 【唯一有效值】
In [73]: codes, uniques = pd.factorize(['b', 'b', 'a', 'c', 'b'])
In [74]: codes
Out[74]: array([0, 0, 1, 2, 0])
In [75]: uniques
Out[75]: array(['b', 'a', 'c'], dtype=object)
# 排序
In [76]: codes, uniques = pd.factorize(['b', 'b', 'a', 'c', 'b'], sort=True)
In [77]: codes
Out[77]: array([1, 1, 0, 2, 1])
In [78]: uniques
Out[78]: array(['a', 'b', 'c'], dtype=object)
# 当Series存在缺失值时
In [80]: codes, uniques = pd.factorize(['b', None, 'a', 'c', 'b'])
In [81]: codes
Out[81]: array([ 0, -1, 1, 2, 0])
In [82]: uniques
Out[82]: array(['b', 'a', 'c'], dtype=object)
# Series直接调用
In [88]: pd.Series([1, 1, 2, 3, 5, 8]).factorize()
Out[88]: (array([0, 0, 1, 2, 3, 4]), Int64Index([1, 2, 3, 5, 8], dtype='int64'))
17. Series.kurt()
Series.kurt(axis=None, skipna=None, level=None, numeric_only=None, **kwargs)
在请求的轴上返回无偏峰度。使用费舍尔峰度定义(正常峰度== 0.0)获得峰度。由N-1归一化。
In [89]: pd.Series([1, 1, 2, 3, 5, 8]).kurt()
Out[89]: 0.5859374999999982
18. Series.mad()
Series.mad(axis=None, skipna=None, level=None)
返回所请求轴的值的平均绝对偏差。
In [90]: pd.Series([1, 1, 2, 3, 5, 8]).mad()
Out[90]: 2.111111111111111
19. Series.max()
Series.max(axis=None, skipna=None, level=None, numeric_only=None, **kwargs)
沿指定轴计算最大值
In [91]: pd.Series([1, 1, 2, 3, 5, 8]).max()
Out[91]: 8
20. Series.min()
Series.min(axis=None, skipna=None, level=None, numeric_only=None, **kwargs)
沿指定轴计算最小值
In [91]: pd.Series([1, 1, 2, 3, 5, 8]).min()
Out[91]: 1
21. Series.mean()
Series.mean(axis=None, skipna=None, level=None, numeric_only=None, **kwargs)
沿指定轴计算平均值
In [91]: pd.Series([1, 1, 2, 3, 5, 8]).mean()
Out[91]: 3.3333333333333335
22. Series.median()
Series.median(axis=None, skipna=None, level=None, numeric_only=None, **kwargs)
沿指定轴计算中位数
# 偶数时中间两数相加/2
In [91]: pd.Series([1, 1, 2, 3, 5, 8]).median()
Out[91]: 2.5
网友评论