基础统计方法
在 Pandas 上做数据统计,要比在 Numpy 上做舒服很多,因为在数据展示上,有很多额外的信息辅助你来消化这些信息。 而且你还能比较方便地绘制成图。
我们在这一节内容中,会对比 Numpy 中的方法和 Pandas 的不同,来解释为什么人们在做数据分析的时候喜欢用 Pandas。
这节内容涉及到的功能有:
- 快速总结
- 日常一般用法
数据¶
在分析数据或者统计数据的时候,首先得有数据,我简单创建了一份数据,后续的工作将会依赖于这份数据,所以请你帮我点击一下下面的 Run 键,初始化一下这份数据。
你在日常生活中,也经常是以这种 2 维表格型数据为主,而且因为各种不可知原因,你的数据可能存在缺失状况。比如有人没交作业,有数据还没被采集到等等。 如果你使用 Excel 收集的数据(用 Pandas 读 Excel),那这种情况可能更加多。
快速总结¶
通常,如果我们不知道这份数据包含了什么,想快速了解一下这份数据的基础信息,我们可以直接先上一个 describe()
,让 Pandas 自动帮我们描述一下这份数据的基础信息。
这里,会显示出来 count
计数(剔除掉 None 或者 NAN 这种无效数据),所以你在结果中能看到 c0
,c2
两个的有效数是 3 个,而 c1
有效数有 4 个。
unique
表示的是每个 column 中有多少独特的数据。这个在初步感知数据丰富度上会有一定的作用。
top
表示出现最多的数据是哪一个,这组数据在 c0
column 处,我们能观察到 0.34
出现了两次,所以它选的 top 是 0.34
。
freq
是继续了 top
,表述的是这个出现频率最多的数据,出现的次数有多少次。
上面这份数据还不是纯数据,如果是纯数值型的数据,我们跑 describe()
还能看到统计学的信息。
平均数(mean),均方差(std),最小值(min),统计学的 25 分位,50 分位,75 分位各是多少,最大值(max)是多少。
均值中位数¶
像上面,我们已经可以从 describe()
功能中略知一二了,但是你肯定也不满足于这些简单的描述信息。那么我们看看还有哪些简单实用的统计学功能。 比较常用的,我们通常会想知道一组数据的均值,用 mean()
就好了。
这样可以直接输出每一个 columns 的均值,因为这是在对 df 的第0个维度在做求均值。也可以这么写。
当然,如果你不想对第 0 个维度,而是想对第 1 个维度求均值呢(后面的功能中 axis 的用法都基本相似)。我们只需要把 axis=0
换成 axis=1
还有一个比较有用的参数 skipna
,这个是用来处理数据中有 None
或者是 NaN
时用的。我们需不需要排除掉有 None 或者 NaN 的数据。 如果需要 skip 掉这些,我们就还是会计算所有行列的数值,只是在计数的时候,扣掉这些 None 和 NaN。而当 skipna=False
的时候, Pandas 只要遇到了 None 或者 NaN,就不计算这列、行的数据了。所以下面你会看到,它只返回了一个 column 的结果。
你看,对比 Numpy 的用法,你会发现, Pandas 在展示信息上还是挺对用户考虑的,它把行名等都展示出来,让人不犯迷糊。
有了上面的 mean()
的用法做铺垫,理解后面的用法也方便很多。比如在计算人民收入的时候, 我们常用中值来代替均值,原因很简单,极高收入群体总是拉高了我们的平均收入, 用中位数反倒能反映出群众的真实收入。 查中值的方式也很简单,就是 median()
。
累加累乘¶
有了上面的 mean()
和 median()
的用法做铺垫,理解后面的用法也方便很多。 比如要对数据做累加和累乘的运算,我们使用方式和 mean()
就没啥差别。
最大最小¶
同理,理解了上面的用法,查找最大最小也不是问题。
不过你注意到没,这种 max()
和 min()
都是对某一维度进行操作的,肯定有时候,你想要找到那个全局最大最小的数,这怎么找? 哈哈,那你就做两次操作吧。或者你可以先把它转成 numpy,然后展平了求全局最大最小。
如果想计算 mean 或者 median 这种,你想想然后再试试,用哪种方式比较合适呢?
处理空值¶
总有 None 或者 NaN 值有时候挺烦人的,因为在做机器学习或者是统计数据的时候,你也不能放它在那不管。比如在机器学习中,如果有空值,你要么就选择放弃这条数据, 要么就要对它进行科学的填充,有人用均值有人用中值等。所以上面学到的技巧都能在这里用上。
第一,你可能想要先看看你的数据中有没有空值。用下面的 isnull()
或者 notnull()
就能找到。
发现这里有空值,下面你就可以对这些 None, Null, NaN 做处理了。要么你就放弃这些有空值的数据,用 dropna()
。
当然,你觉得数据只要有值你就想留下来,只去除掉那些全为空的数据,那么你还能在筛选的时候加一个 how="all"
参数。
刚也说了,除了 drop 掉有 None 的,还可以对这些空值进行填充,填充的值也可以自行选定。
对不同特征列做差异化的填充数值。
甚至,如果你有一个每一位上的默认值,你都可以用一个全新的 df 来做空位的填充。
获取索引¶
一般来说,当你想用 np.argmax()
或者 np.argmin()
的时候,你可以在 pandas 用 idxmax()
和 idxmin()
来替换。原理都一样, 就是找到那个最大最小值的索引。这个的好处是,你只关注索引而不用关注值,你可以对这个索引的值做你想要的后续处理。
同上面一样,你还能用上面学到的 skipna
来对空值做控制。
总结¶
在机器学习或者统计学中,只要你是和数据打交道,就少不了先观察和了解数据。用 Pandas 的这些功能,可以帮你快速了解数据的全貌, 也可以对其中的数据缺失做一些处理。