Pandas入门(下)
Martin
汇总和计算描述统计
pandas
对象拥有一组常用的数学和统计方法。它们大部分都属于约简和汇总统计,用于从Series
中提取单个值(如sum
或mean
)或从DataFrame
的行或列中提取一个Series
。跟对应的Numpy
数组方法相比,它们都是基于没有确实数据的假设而构建的。来看一个例子:
>>> df = 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
调用DataFrame
的sum
方法将返回以含有列小计的Series
:
>>> df.sum()
one 9.25
two -5.80
dtype: float64
传入axis=1
将会按行进行求和运算:
>>> df.sum(axis=1)
a 1.40
b 2.60
c 0.00
d -0.55
dtype: float64
NA
值会被自动排除,除非整个切片(这里指的是行或列)都是NA
。通过skipna
选项可以禁用该功能:
>>> df.mean(axis=1,skipna=False)
a NaN
b 1.300
c NaN
d -0.275
dtype: float64
下表列出了这些简约方法的常用项:
选项 | 说明 |
---|---|
axis | 约简的轴。DataFrame的行用0,列用1 |
skipna | 排除缺失值,默认值True |
level | 如果轴是层次化索引(MultiIndex),则根据level分组约简 |
有些方法(如idxmax和idxmin)返回的是间接统计(比如达到最小值或最大值的索引):
>>> df.idxmax()
one b
two d
dtype: object
另一些方法则是累计型的:
>>> df.cumsum() # 逐行叠加
one two
a 1.40 NaN
b 8.50 -4.5
c NaN NaN
d 9.25 -5.8
还有种方法,它既不是约简型也不是累计型。describe
就是这样的一个例子,它用于一次性产生多个汇总统计:
one two
count 3.000000 2.000000
mean 3.083333 -2.900000
std 3.493685 2.262742
min 0.750000 -4.500000
25% NaN NaN
50% NaN NaN
75% NaN NaN
max 7.100000 -1.300000
对于非数值型数据,describe
会产生另一种统计汇总:
>>> obj = 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
>>> obj.describe()
count 16
unique 3
top a # 出现次数最高的选项
freq 8 # 针对的top的频率
dtype: object
下表列出了所有与描述统计相关的方法:
方法 | 说明 |
---|---|
count | 非NA值的数量 |
describe | 针对Series或各DataFrame列计算汇总统计 |
min、max | 计算最小值和最大值 |
argmin、argmax | 计算能够获取到最小值和最大值的索引位置 |
idxmin、idxmax | 计算能够获取到最小值和最大值的索引值 |
quantile | 计算样本的分位数(0到1) |
sum | 值的总和 |
mean | 值的平均数 |
median | 值的算数中位数(50%分位数) |
mad | 根据平均值计算平均绝对离差 |
var | 样本的方差额 |
std | 样本的标准差 |
skew | 样本值的偏度(三阶矩) |
kurt | 样本值的峰度(四阶矩) |
cumsum | 样本值的累计和 |
cummin、cummax | 样本值的累计最大值和累计最小值 |
cumpord | 样本值的累计积 |
diff | 计算一阶差分 |
pct_change | 计算百分数变化 |
- 唯一值、值计数以及成员资格
还有一类方法可以从一维Series
的值中抽取信息。来个例子:
>>> obj = Series(['c','a','d','a','a','b','b','c','c'])
第一个函数是unique
,它可以得到Series
中的唯一值数组:
>>> uniques = obj.unique()
>>> uniques
array(['c', 'a', 'd', 'b'], dtype=object)
返回的唯一值是未排序的,如果需要的话,可以对结果再次进行排序(uniques,sor())。value_counts
用于计算一个Series
中各值出现的频率:
>>> obj.value_counts()
c 3
a 3
b 2
d 1
dtype: int64
为了便于查看,结果Series
是按降序排列的(由参数ascending=False控制)。value_counts
还是一个顶级ndarray
的方法,可用于任何数组或序列:
>>> obj.value_counts(ascending=True)
d 1
b 2
a 3
c 3
dtype: int64
最后是isin
函数,它用于判断矢量化集合的成员资格,可用于选取Series
中或DataFrame
列中数据的子集:
>>> mask = obj.isin(['c','b'])
>>> mask
0 True
1 False
2 False
3 False
4 False</