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