5.3 汇总和计算描述统计
5.3.1 约简与汇总统计
In [230]: 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'])
In [231]: df
Out[231]:
one two
a 1.40 NaN
b 7.10 -4.5
c NaN NaN
d 0.75 -1.3
# 调⽤DataFrame的sum⽅法将会返回⼀个含有列的和的Series
In [232]: df.sum()
Out[232]:
one 9.25
two -5.80
dtype: float64
# 传⼊axis='columns'或axis=1将会按⾏进⾏求和运算
In [233]: df.sum(axis=1)
Out[233]:
a 1.40
b 2.60
c NaN
d -0.55
# NA值会⾃动被排除,除⾮整个切⽚(这⾥指的是⾏或列)都是NA。通过skipna选项可以禁⽤该功能
In [234]: df.mean(axis='columns', skipna=False)
Out[234]:
a NaN
b 1.300
c NaN
d -0.275
dtype: float64
# 有些⽅法(如idxmin和idxmax)返回的是间接统计(⽐如达到最⼩值或最⼤值的索引)
In [235]: df.idxmax()
Out[235]:
one b
two d
dtype: object
# 累计型
In [236]: df.cumsum()
Out[236]:
one two
a 1.40 NaN
b 8.50 -4.5
c NaN NaN
d 9.25 -5.8
# describe可⽤于⼀次性产⽣多个汇总统计
In [237]: df.describe()
Out[237]:
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会产⽣另外⼀种汇总统计
In [238]: obj = pd.Series(['a', 'a', 'b', 'c'] * 4)
In [239]: obj.describe()
Out[239]:
count 16
unique 3
top a
freq 8
dtype: object
-
约简方法常用参数
选项 说明 axis 约简的轴,行为0,列为1 skipna 排除缺失值,默认为True level 如果轴是层次化索引的,则根据level分组约简 -
描述与统计函数
函数 说明 count 非NA值的数量 describe 汇总统计 min, max 计算最值 argmin, argmax 返回最值的索引位置 idxmin, idxmax 返回最值的索引值 quantile 计算样本的分位数 sum 求和 mean 求平均数 median 求算数中位数 mad 根据平均值计算平均绝对离差 var 求方差 std 求标准差 skew 求偏度(三阶矩) kurt 求峰度(四阶矩) cumsum 累加 cummin, cummax 累计最大值,累计最小值 cumprod 累乘 diff 计算一阶差分 pct_change 计算百分数变化
5.3.2 相关系数与协方差
# Series的corr⽅法⽤于计算两个Series中重叠的、⾮NA的、按索引对⻬的值的相关系数
# cov⽤于计算协⽅差
In [244]: returns['MSFT'].corr(returns['IBM'])
Out[244]: 0.49976361144151144
In [245]: returns['MSFT'].cov(returns['IBM'])
Out[245]: 8.8706554797035462e-05
# DataFrame的corr和cov⽅法将以DataFrame的形式分别返回完整的相关系数或协⽅差矩阵
In [247]: returns.corr()
Out[247]:
AAPL GOOG IBM MSFT
AAPL 1.000000 0.407919 0.386817 0.389695
GOOG 0.407919 1.000000 0.405099 0.465919
IBM 0.386817 0.405099 1.000000 0.499764
MSFT 0.389695 0.465919 0.499764 1.000000
In [248]: returns.cov()
Out[248]:
AAPL GOOG IBM MSFT
AAPL 0.000277 0.000107 0.000078 0.000095
GOOG 0.000107 0.000251 0.000078 0.000108
IBM 0.000078 0.000078 0.000146 0.000089
MSFT 0.000095 0.000108 0.000089 0.000215
5.3.3 唯一值、值计数以及成员资格
# 函数unique可以得到Series中的唯⼀值数组。返回的唯⼀值是未排序的,如果需要的话,可以对结果再次进⾏排序(uniques.sort())
In [251]: obj = pd.Series(['c', 'a', 'd', 'a', 'a', 'b', 'b', 'c', 'c'])
In [252]: uniques = obj.unique()
In [253]: uniques
Out[253]: array(['c', 'a', 'd', 'b'], dtype=object)
# value_counts⽤于计算⼀个Series中各值出现的频率,结果Series是按值频率降序排列的
In [254]: obj.value_counts()
Out[254]:
c 3
a 3
b 2
d 1
dtype: int64
# isin⽤于判断⽮量化集合的成员资格,可⽤于过滤Series中或DataFrame列中数据的⼦集
In [256]: obj
Out[256]:
0 c
1 a
2 d
3 a
4 a
5 b
6 b
7 c
8 c
dtype: object
In [257]: mask = obj.isin(['b', 'c'])
In [258]: mask
Out[258]:
0 True
1 False
2 False
3 False
4 False
6 True
7 True
8 True
dtype: bool
In [259]: obj[mask]
Out[259]:
0 c
5 b
6 b
7 c
8 c
dtype: object
# Index.get_indexer⽅法可以给你⼀个索引数组,从可能包含重复值的数组到另⼀个不同值的数组
In [260]: to_match = pd.Series(['c', 'a', 'b', 'b', 'c', 'a'])
In [261]: unique_vals = pd.Series(['c', 'b', 'a'])
In [262]: pd.Index(unique_vals).get_indexer(to_match)
Out[262]: array([0, 2, 1, 1, 0, 2])