汇总和计算描述性统计
pandas包含一系列汇总和统计函数。多数函数属于归纳或者汇总统计的范畴,这些函数从Series中计算出一个单值(如sum和mean函数),或从DataFrame的每行(列)抽取出一个Series对象。与Numpy中相对应的函数不一样的是,pandas的函数内建处理缺失值的能力。
1 | import numpy as np |
one | two | |
---|---|---|
a | 1.40 | NaN |
b | 7.10 | -4.5 |
c | NaN | NaN |
d | 0.75 | -1.3 |
1 | df.sum() #按列统计每一行的和 |
one 9.25
two -5.80
dtype: float64
1 | df.sum(axis='columns') #指定轴为列,则计算每行各列的和 |
a 1.40
b 2.60
c 0.00
d -0.55
dtype: float64
缺失值缺省情况下被排除于计算过程中。使用skipna参数修改这种行为。计算平均数的例子:
1 | df.mean(axis='columns') |
a 1.400
b 1.300
c NaN
d -0.275
dtype: float64
1 | df.mean(axis='columns', skipna=False) #只要包含Nan,则整行的平均值都是Nan。 |
a NaN
b 1.300
c NaN
d -0.275
dtype: float64
另外一些函数,如idxmax和idxmin函数,返回最大值或最小值对应的索引。
1 | df.idxmax() |
one b
two d
dtype: object
还有一种是累积函数,如cumsum。
1 | df.cumsum() |
one | two | |
---|---|---|
a | 1.40 | NaN |
b | 8.50 | -4.5 |
c | NaN | NaN |
d | 9.25 | -5.8 |
还有一种函数既非归纳性函数也非累加性函数。如describe函数,它计算出一些统计数据的汇总性描述数据。
1 | df.describe() |
one | two | |
---|---|---|
count | 3.000000 | 2.000000 |
mean | 3.083333 | -2.900000 |
std | 3.493685 | 2.262742 |
min | 0.750000 | -4.500000 |
25% | 1.075000 | -3.700000 |
50% | 1.400000 | -2.900000 |
75% | 4.250000 | -2.100000 |
max | 7.100000 | -1.300000 |
对于非数值数据,describe函数给出替代性的描述信息。
1 | obj = pd.Series(['a', 'a', 'b', 'c'] * 4) |
0 a
1 a
2 b
3 c
4 a
5 a
6 b
7 c
8 a
9 a
10 b
11 c
12 a
13 a
14 b
15 c
dtype: object
1 | obj.describe() #给出总数、不重复的数的数量、第一个值、重复最多的数 |
count 16
unique 3
top a
freq 8
dtype: object
描述性和汇总统计函数表
函数 | 说明 |
---|---|
count | 个数(不包含缺失值) |
describe | 汇总统计数值集合 |
min, max | 最小、最大值 |
argmin, argmax | 最小值、最大值所在的索引位置(整数) |
idxmin, idxmax | 最小值、最大值所在的索引标签 |
quantile | 分位数 |
sum | 和 |
mean | 平均值 |
median | 中位数 |
mad | 与绝对值之间的平均绝对偏差 |
prod | 阶乘 |
var | 样本方差 |
std | 样本标准差 |
skew | 样本偏度 |
kurt | 样本峰度 |
cumsum | 累加和 |
cummin, cummax | 累加最小值、累加最大值 |
cumprod | 累加乘积 |
diff | 计算算数差(时间序列比较有用) |
pct_change | 计算百分比变化 |
相关性和协方差
某些统计函数如相关性和协方差的函数是对成对参数进行计算。我们考虑一下,如果想要从Yahoo中获取股票价格和成交量的DataFrame,这需要安装另外的pandas-datareader包。如果还没有安装,可以使用conda install pandas-datareader
安装。
1 | import pandas_datareader.data as web |
1 | price = pd.DataFrame({ticker: data['Adj Close'] for ticker, data in all_data.items()}) |
1 | returns = price.pct_change() |
AAPL | GOOG | IBM | MSFT | |
---|---|---|---|---|
Date | ||||
2017-12-22 | 0.000000 | -0.003300 | 0.006601 | 0.000117 |
2017-12-26 | -0.025370 | -0.003188 | 0.002164 | -0.001286 |
2017-12-27 | 0.000176 | -0.006974 | 0.001963 | 0.003630 |
2017-12-28 | 0.002814 | -0.001172 | 0.005943 | 0.000117 |
2017-12-29 | -0.010814 | -0.001660 | -0.004025 | -0.002100 |
corr函数计算两个序列之间的相关系数。cov计算协方差。
1 | returns['MSFT'].corr(returns['IBM']) |
0.46607663413008699
1 | returns['MSFT'].cov(returns['IBM']) |
7.7153494329051242e-05
因为MSFT是一个合法的python属性,所以也可以用属性访问的方式:
1 | returns.MSFT.corr(returns.IBM) |
0.46607663413008699
DataFrame的corr和cov函数可以计算两两之间的相关系统和协方差。
1 | returns.corr() |
AAPL | GOOG | IBM | MSFT | |
---|---|---|---|---|
AAPL | 1.000000 | 0.416158 | 0.355443 | 0.396363 |
GOOG | 0.416158 | 1.000000 | 0.379598 | 0.480037 |
IBM | 0.355443 | 0.379598 | 1.000000 | 0.466077 |
MSFT | 0.396363 | 0.480037 | 0.466077 | 1.000000 |
1 | returns.cov() |
AAPL | GOOG | IBM | MSFT | |
---|---|---|---|---|
AAPL | 0.000254 | 0.000100 | 0.000067 | 0.000089 |
GOOG | 0.000100 | 0.000228 | 0.000068 | 0.000102 |
IBM | 0.000067 | 0.000068 | 0.000139 | 0.000077 |
MSFT | 0.000089 | 0.000102 | 0.000077 | 0.000197 |
使用corrwith函数,DataFrame的行或列可以与其他DataFrame或Series计算配对的相关性。
传入一个Series对象,则返回一个每列与之配对计算相关系数的Series对象。
1 | returns.corrwith(returns.IBM) |
AAPL 0.355443
GOOG 0.379598
IBM 1.000000
MSFT 0.466077
dtype: float64
传入一个DataFrame对象,计算列名匹配的相关系数。
1 | returns.corrwith(volume) |
AAPL -0.068543
GOOG -0.013207
IBM -0.158880
MSFT -0.085835
dtype: float64
可以使用axis='columns'
参数按行计算。
唯一值、值计数和成员关系。
1 | obj = pd.Series(['c', 'a', 'd', 'a', 'a', 'b', 'b', 'c', 'c']) |
array(['c', 'a', 'd', 'b'], dtype=object)
1 | obj.value_counts() #计算每个值出现次数 |
a 3
c 3
b 2
d 1
dtype: int64
1 | pd.value_counts(obj.values, sort=False) #value_counts作为pandas顶层函数提供,可应用于任何数组或序列 |
c 3
d 1
a 3
b 2
dtype: int64
1 | mask = obj.isin(['b', 'c']) #测试元素是否是参数的成员 |
0 True
1 False
2 False
3 False
4 False
5 True
6 True
7 True
8 True
dtype: bool
1 | obj[mask] #布尔数组过滤掉不是成员的元素 |
0 c
5 b
6 b
7 c
8 c
dtype: object
1 | to_match = pd.Series(['c', 'a', 'b', 'b', 'c', 'a']) |
array([0, 2, 1, 1, 0, 2], dtype=int32)
有时,我们需要对DataFrame的每列绘制直方图,不同的列之间存在相关关系。我们需要整体汇总所有的数据在每列中出现的次数,这时我们可以使用DataFrame的apply函数,其参数传入pandas.value_counts。举例:
1 | data = pd.DataFrame({'Qu1': [1, 3, 4, 3, 4], |
Qu1 | Qu2 | Qu3 | |
---|---|---|---|
0 | 1 | 2 | 1 |
1 | 3 | 3 | 5 |
2 | 4 | 1 | 2 |
3 | 3 | 2 | 4 |
4 | 4 | 3 | 4 |
对每一列进行数据计数,结果的每一行是全部数据中的不重复值。若某一列对应的行标签所列出的数据不存在,该列对应的位置的数据则填充为0。
apply函数是按列对数据进行计数的。
1 | result = data.apply(pd.value_counts).fillna(0) |
Qu1 | Qu2 | Qu3 | |
---|---|---|---|
1 | 1.0 | 1.0 | 1.0 |
2 | 0.0 | 2.0 | 1.0 |
3 | 2.0 | 2.0 | 0.0 |
4 | 2.0 | 0.0 | 2.0 |
5 | 0.0 | 0.0 | 1.0 |