pandas学习笔记2:汇总和计算描述性统计

汇总和计算描述性统计

pandas包含一系列汇总和统计函数。多数函数属于归纳或者汇总统计的范畴,这些函数从Series中计算出一个单值(如sum和mean函数),或从DataFrame的每行(列)抽取出一个Series对象。与Numpy中相对应的函数不一样的是,pandas的函数内建处理缺失值的能力。

1
2
3
4
import numpy as np
import pandas as pd
df = pd.DataFrame([[1.4, np.nan], [7.1, -4.5],[np.nan, np.nan], [0.75, -1.3]],index=['a', 'b', 'c', 'd'],columns=['one', 'two'])
df
































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
2
obj = pd.Series(['a', 'a', 'b', 'c'] * 4)
obj
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
2
import pandas_datareader.data as web
all_data = {ticker: web.get_data_yahoo(ticker) for ticker in ['AAPL', 'IBM', 'MSFT', 'GOOG']}
1
2
price = pd.DataFrame({ticker: data['Adj Close'] for ticker, data in all_data.items()})
volume = pd.DataFrame({ticker: data['Volume'] for ticker, data in all_data.items()})
1
2
returns = price.pct_change()
returns.tail() #Yahoo已经被Verizon收购了,竟然还能取得数据,太神奇了!!!
























































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
2
3
obj = pd.Series(['c', 'a', 'd', 'a', 'a', 'b', 'b', 'c', 'c'])
uniques = obj.unique() #重复的元素保留一个
uniques
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
2
mask = obj.isin(['b', 'c'])  #测试元素是否是参数的成员
mask
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
2
3
to_match = pd.Series(['c', 'a', 'b', 'b', 'c', 'a'])
unique_vals = pd.Series(['c', 'b', 'a'])
pd.Index(unique_vals).get_indexer(to_match) #get_indexer函数返回每个元素在参数序列中匹配的索引位置
array([0, 2, 1, 1, 0, 2], dtype=int32)

有时,我们需要对DataFrame的每列绘制直方图,不同的列之间存在相关关系。我们需要整体汇总所有的数据在每列中出现的次数,这时我们可以使用DataFrame的apply函数,其参数传入pandas.value_counts。举例:

1
2
3
4
data = pd.DataFrame({'Qu1': [1, 3, 4, 3, 4],
'Qu2': [2, 3, 1, 2, 3],
'Qu3': [1, 5, 2, 4, 4]})
data











































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
2
result = data.apply(pd.value_counts).fillna(0)  
result











































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