引入
前段时间我们了解了pandas数据分析工具的一些函数妙用,并学习了如何制作一些简单的图表。
但细心的同学不难发现我们一直是在针对数字进行处理,这要求我们在统计获取数据之初就对数据进行编码。
但是实际生活中会出现很多无法统一标准的数据。
就拿当今最火的某电商平台为例,我们之前做过的数据分析是基于用户行为的,这些数据是有固定情况的(如当时我们用0代表浏览,1代表购买,2代表收藏,3代表加入购物车),此类数据只需要这样编码一下,赋予每种行为一个代数即可进行统计分析
而商品的款式呢?颜色呢?此类数据存在难以计数的情况,且可能实时更新,比如商家今天上新一个“雾霾蓝”的雨伞,明天上新一个“普鲁士蓝”的帽子……
难道你要每新增一个商品就多加一个编码吗?每天数不清的商品新增,最终你是否需要为这些编码准备一个数据库,分析的时候查询一下这个编码代表的是什么商品吗?
显然不现实。我们需要对此类数据直接进行字符串的处理。今天就不妨让我们一起来看看吧~
一、字符数据导入与基本了解
我们这里采用某大数据平台提供的电商平台商品数据当然,是带有不规则字符串的
用文件的打开方式打开csv文件。
Tip:其实CSV文件本质上可以理解成是文本文件了,这个与xlsx等Excel带格式的文件不一样哈。
我们用len()
函数看看一共有多少条记录
用a.columns()
查看有多少个columns。可以理解成就是有多少个列,把这些列的名字列出来。
从这里,细心的伙伴们可能就发现了,可以查看columns,那这个a是不是dataframe类型的数据啊~
答案是肯定的~我们仍旧可以用dataframe的操作方法来应用在这里导入的csv字符串文件上。
我们在之前已经提到过,有许多商品的信息特征是空值具体有多少空值我们是需要进行了解的,以免之后的处理遇到未知的问题——可以把这步视作数据清洗的前摇了:
a.isnull().sum()#查看各个column有多少空值 复制代码
isnull函数记录是否为空值。sum()用于统计。
注意isnull运行过后,返回值是原dataframe同大小的一个新dataframe,每个单元格里是布尔型的数据
sum是在统计每个column中为True的个数
为什么sum统计的是每个column的True的个数呢?
sum()函数默认竖向统计,因为通常情况下这样更有意义(比如这里竖向统计的是各个信息栏对应的空缺值,来看看哪个信息许多商家都没填写,从而为今后设置哪些必填信息提供决策参考。横向的每条数据一般都是单位商品,如果统计的话就是看看各个商品都有哪些信息没填,这样统计起来数据量非常大,相当于大数据分析完了还是大数据。)如果你还是希望横向统计每行的True的个数,可以设置sum的参数axis=1,这样结果就是横向统计了。
二、字符串处理
这里只需要记住一点:
Pandas字符串处理基本都是借助str相关函数和方法实现的
这里就是用常见的字符串处理方法。(文案我们采用字节跳动稀土掘金,亲切感满满)
len函数统计长度返回数值
split函数按特定字符分割字符串返回列表
replace函数替换特点值
find函数返回第一个特定字符的索引(注意索引从0开始)
三、基于生成序列的groupby
我们可以再次用groupby实现一些妙用。比如统计一些各个省份商品的数量:
a.location.str.split(" ",expand=True)[0].head()
我们可以分析一下这串代码。
首先a.location很简单,就是把dataframe的location列提取出来。
难道这样就是各个商品的城市了吗
我们发现有些商品有两个城市
处。
我们需要把首要城市提取出来,逻辑上比较合理些(好比你参加了一百篇SCI但是没有一篇一作,你觉得周围人会怎么评价你)
于是我们采用.str
把这个dataframe每行转化成字符串,再用split
函数以空格为界把两个城市提取出来,此时城市已经成为含有多个元素的列表。设置参数expand=true可以使数据类型变回dataframe。最后用列表索引[0]
把最前面的城市分别提取出来即可。
一次groupby的妙用,按a.location.str.split(" ",expand=True)[0]
来分组,这就是小标题说的基于序列的groupby。最后size()统计之后就可以获得每个城市的数据了。这样的数据比较整洁且有意义
——你说为什么这么麻烦?直接groupby函数传入location作为参数不行吗?
如图,每个城市组合都作为一个分组,这样大伙儿能看出来哪个城市商品最多吗?