利用Python进行数据分析——pandas入门(6)
原创
©著作权归作者所有:来自51CTO博客作者wx63a03d571f3d9的原创作品,请联系作者获取转载授权,否则将追究法律责任
2.3 描述性统计的概述与计算
pandas
对象装配了一个常用数学、统计学方法的集合。
In [134]: 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 [135]: df
Out[135]:
one two
a 1.40 NaN
b 7.10 -4.5
c NaN NaN
d 0.75 -1.3
In [136]: df.sum() # 列求和
Out[136]:
one 9.25
two -5.80
dtype: float64
In [137]: df.sum(axis='columns') # 行求和
Out[137]:
a 1.40
b 2.60
c 0.00
d -0.55
dtype: float64
In [6]: df.mean(axis='columns') # 除非整个切片上都是NA,否则NA将会被排除
Out[6]:
a 1.40
b 1.30
c NaN
d -0.28
dtype: float64
In [6]: df.mean(axis='columns') # 可以通过skipna排除
Out[6]:
a 1.40
b 1.30
c NaN
d -0.28
dtype: float64
还有一类方法既不是归约型方法也不是积累型方法。describe
就是其中之一,它一次性产生多个汇总统计:
In [7]: df.describe()
D:\Anaconda3\lib\site-packages\numpy\lib\function_base.py:3834: RuntimeWarning: Invalid value encountered in percentile
RuntimeWarning)
Out[7]:
one two
count 3.000000 2.000000
mean 3.080000 -2.900000
std 3.497027 2.262742
min 0.740000 -4.500000
25% NaN NaN
50% NaN NaN
75% NaN NaN
max 7.100000 -1.300000
In [8]: obj = pd.Series(['a', 'b', 'c', 'd'] * 4)
In [9]: obj
Out[9]:
0 a
1 b
2 c
3 d
4 a
5 b
6 c
7 d
8 a
9 b
10 c
11 d
12 a
13 b
14 c
15 d
dtype: object
In [10]: obj.describe() # 对于非数值型数据,describe产生另一种汇总统计:
Out[10]:
count 16
unique 4
top c
freq 4
dtype: object
2.3.1 唯一值、计数和成员属性
In [7]: obj = pd.Series(['c', 'd', 'c', 's', 'a', 'a', 'q', 'q'])
In [8]: obj
Out[8]:
0 c
1 d
2 c
3 s
4 a
5 a
6 q
7 q
dtype: object
In [9]: obj.unique()
Out[9]: array(['c', 'd', 's', 'a', 'q'], dtype=object)
In [10]: obj.value_counts()
Out[10]:
a 2
q 2
c 2
s 1
d 1
dtype: int64
isin
执行向量化的成员属性检查,还可以将数据集以Series
或DataFrame
一列的形式过滤为数据集的值子集:
In [11]: obj
Out[11]:
0 c
1 d
2 c
3 s
4 a
5 a
6 q
7 q
dtype: object
In [12]: mask = obj.isin(['b', 'c'])
In [13]: mask
Out[13]:
0 True
1 False
2 True
3 False
4 False
5 False
6 False
7 False
dtype: bool
In [14]: obj[mask]
Out[14]:
0 c
2 c
dtype: object
与isin
相关的Index.get_indexer
方法,可以提供一个索引数组,这个索引数组可以将可能非唯一值数组转换为另一个唯一值数组:
In [16]: to_match = pd.Series(['c', 'a', 'b', 'b', 'c', 'a'])
In [17]: unique_vals = pd.Series(['c', 'b', 'a'])
In [18]: pd.Index(unique_vals).get_indexer(to_match)
Out[18]: array([0, 2, 1, 1, 0, 2], dtype=int64)
唯一值、计数和集合成员属性方法
In [24]: data = pd.DataFrame({'Qu1' : [1,4,3,4,4], 'Qu2' : [2,3,1,2,3], 'Qu3' : [1,5,2,4
...: ,4,]})
In [25]: data
Out[25]:
Qu1 Qu2 Qu3
0 1 2 1
1 4 3 5
2 3 1 2
3 4 2 4
4 4 3 4
In [26]: result = data.apply(pd.value_counts).fillna(0)
In [27]: result
Out[27]:
Qu1 Qu2 Qu3
1 1.0 1.0 1.0
2 0.0 2.0 1.0
3 1.0 2.0 0.0
4 3.0 0.0 2.0
5 0.0 0.0 1.0
这里,结果中的行标签是所有列中出现的不同值,数值则是这些不同值在每个列中出现的次数。