13.统计和汇总
统计和汇总
Pandas也有一套和Numpy类似的数学、统计学方法。不过在使用中要注意的是,Numpy通常将数组看作一个整体,而Pandas通常对列进行操作。当然,这两者也能单独对行进行操作。另外,Pandas内建了处理缺失值的功能,这一点是numpy不具备的。
In [131]: df = pd.DataFrame([[1.4, np.nan],[7.1,-4.2],[np.nan,np.nan],[0.75,-1.1]],index=list('abcd'),columns=['one','two'])
In [132]: df
Out[132]:
one two
a 1.40 NaN
b 7.10 -4.2
c NaN NaN
d 0.75 -1.1
In [133]: df.sum() # 默认对列进行求和,并返回一个Series对象,缺失值默认被忽略
Out[133]:
one 9.25
two -5.30
dtype: float64
In [134]: df.sum(axis='columns') # 指定对行进行求和
Out[134]:
a 1.40
b 2.90
c 0.00
d -0.35
dtype: float64
In [135]: df.mean(axis='columns', skipna=False) # 对行求平均值,但不忽略缺失值
Out[135]:
a NaN
b 1.450
c NaN
d -0.175
dtype: float64
下面是主要的统计和汇总方法:
方法 | 描述 |
---|---|
min | 最小值 |
max | 最大值 |
idxmin | 返回某行或某列最小值的索引 |
idxmax | 最大值的索引 |
cumsum | 累加 |
cumprod | 累乘 |
count | 统计非NaN的个数 |
describe | 汇总统计集合 |
quantile | 计算样本的从0到1间的分位数 |
sum | 求和 |
mean | 平均值 |
median | 中位数(50%) |
mad | 平均值的平均绝对偏差 |
prod | 所有值的积 |
var | 方差 |
std | 标准差 |
skew | 样本偏度,第三时刻值 |
kurt | 样本峰度,第四时刻值 |
diff | 计算第一个算术差值 |
pct_change | 计算百分比 |
In [136]: df.idxmax()
Out[136]:
one b
two d
dtype: object
In [137]: df.idxmin()
Out[137]:
one d
two b
dtype: object
In [138]: df.cumsum()
Out[138]:
one two
a 1.40 NaN
b 8.50 -4.2
c NaN NaN
d 9.25 -5.3
In [139]: df.cumprod()
Out[139]:
one two
a 1.400 NaN
b 9.940 -4.20
c NaN NaN
d 7.455 4.62
In [144]: df.count()
Out[144]:
one 3
two 2
dtype: int64
最重要的describe方法:
In [140]: df.describe()
Out[140]:
one two
count 3.000000 2.000000
mean 3.083333 -2.650000
std 3.493685 2.192031
min 0.750000 -4.200000
25% 1.075000 -3.425000
50% 1.400000 -2.650000
75% 4.250000 -1.875000
max 7.100000 -1.100000
In [141]: s=pd.Series(list('aabc'*4))
In [143]: s.describe() # 对于非数值型,统计类型不一样
Out[143]:
count 16
unique 3
top a
freq 8
dtype: object
还有几个非常重要的方法:
- unique:计算唯一值数组,并按观察顺序返回
- value_counts:计数,并按多到少排序
- isin:判断是否包含成员
In [147]: s = pd.Series(list('cadaabbcc'))
In [149]: uniques = s.unique() # 获取去重后的值
In [150]: uniques # 这是一个array数组
Out[150]: array(['c', 'a', 'd', 'b'], dtype=object)
In [151]: s.value_counts() # 计数,默认从多到少排序
Out[151]:
a 3
c 3
b 2
d 1
dtype: int64
In [152]: pd.value_counts(s, sort=False) # 也可以这么调用,并且不排序
Out[152]:
d 1
c 3
a 3
b 2
dtype: int64
In [155]: mask = s.isin(['b','c']) # 判断Series的元素在不在b和c里面
In [156]: mask # 这是一个bool类型
Out[156]:
0 True
1 False
2 False
3 False
4 False
5 True
6 True
7 True
8 True
dtype: bool
In [157]: s[mask]
Out[157]:
0 c
5 b
6 b
7 c
8 c
dtype: object