龙空技术网

掌握这5种方法,让你使用python进行数据分析可以事半功倍

技顽 65

前言:

目前我们对“使用python进行数据分析”大体比较关心,各位老铁们都想要分析一些“使用python进行数据分析”的相关资讯。那么小编在网络上收集了一些对于“使用python进行数据分析””的相关资讯,希望大家能喜欢,小伙伴们快快来了解一下吧!

本篇针对Python语言的数据分析库(pandas),分享了5个可以提升数据处理效率的解决方案,总结来说就是,不用不知道,一用真高效!符合真香定律···

针对不同情况下的nan值定位

涉及到数据的清洗,那么nan值必然是一个需要处理的问题,不论是直接舍弃还是填充值,总是需要先定位nan值在哪里,再根据数据特点去做相应的操作。这里我分享下我个人对定位nan值问题一些好的实践

详看以下代码,主要包含三种情况的定位

import pandas as pdimport numpy as npdf = pd.DataFrame({"name": [i for i in list("abcde")], "age": [i for i in range(10, 15)], "female": ["f", np.nan, "m", np.nan, "m"]})# 数据呈现是这个样子name    age    femalea       10      fb       11      NaNc       12      fd       13      me       14      NaN

第一个方法:df.isnull().any()

通过结果可以看的出来,这个语句返回的是所有列是否含有nan值的布尔值

对于一个大数据文件来讲,你想一瞬间知道哪些字段有nan值需要处理,那么这个命令就可以让你瞬间看到结果,再针对结果做处理即可

# 结果展示 :显示只有female列有nan值存在name      Falseage       Falsefemale     Truedtype: bool

第二个方法:df["female"].isnull()

结果如下,返回的是每个值是否为nan值的布尔值

第一个方法已经确定了哪些列有nan值,那么接下来你可能想知道的是这些字段中哪些值是nan值,那么这个方法就可以帮你定位

0    False1     True2    False3     True4    FalseName: female, dtype: bool

第三个方法:df[df.isnull().values==True]

结果如下:返回的是数据表中含有nan值的所有行

还有个写法很推荐, df[df.列名.isnull().values==True],因为有些列的nan值没有什么实际作用,也不用处理,那么有些列则必须不能有nan值,那么就可以通过这个命令专门针对某一列进行nan值的定位

这个命令是我用的最多的,因为在大数据文件中,如果nan值非常少,那么这种方法的定位非常有有效率且直接

# 	结果展示 :返回所有存在nan值name	age	female1	b	11	NaN3	d	13	NaN
把每个人的爱好汇总

有的时候你会面临一种情况:你需要把某一列的值根据一定的分组要求分类聚合到一起,然后统一进行一系列的运算,需求如下所示

# 构建案例数据import pandas as pddf = pd.DataFrame({"name": ["小明", "小明", "小明", "小明", "小明", "小明", "小红", "小红", "小红", "小红", "小红"],                  "爱好": ["篮球", "足球", "乒乓球", "唱歌", "跳舞", "跳绳", "喝酒", "抽烟", "烫头", "蹦迪", "瑜伽"]})# 数据呈现如下	name	爱好0	小明	篮球1	小明	足球2	小明	乒乓球3	小明	唱歌4	小明	跳舞5	小明	跳绳6	小红	喝酒7	小红	抽烟8	小红	烫头9	小红	蹦迪10	小红	瑜伽

需求结果要如下所示

# 我们发现需求简单来说 就是将小明和小红的爱好汇总到一起        name	爱好0	小明	篮球,足球,乒乓球,唱歌,跳舞,跳绳1	小红	喝酒,抽烟,烫头,蹦迪,瑜伽

想要实现这个效果,代码如下

# 先分组,然后将分组内容聚合(这里是以“,”连接)new_df = df.groupby(["name"])["爱好"].apply(lambda x: x.str.cat(sep=",")).reset_index()
一波反向操作

有时候在筛选数据集的时候条件很复杂,但是这些复杂的对立条件却只有一个,这种情况下就可以通过对立条件筛选反集,筛选所需要的数据,一般来讲,涉及到"isin"的时候有可能用的到

import numpy as npimport pandas as pddf = pd.DataFrame({"省": ["辽宁", "辽宁", "辽宁", "四川", "四川", "四川", "四川", "山东", "山东"], "市": ["沈阳", "大连", "盘锦", "成都", "资阳", "绵阳","乐山", "青岛", "菏泽"]})# 数据呈现如下	省	市0	辽宁	沈阳1	辽宁	大连2	辽宁	盘锦3	四川	成都4	四川	资阳5	四川	绵阳6	四川	乐山7	山东	青岛8	山东	菏泽

需求描述为:要呈现除了沈阳之外的数据

#实现代码如下, 这种就可以直接取反集,直接将沈阳的排除df = df[~(df.市 == "沈阳")]# 结果呈现如下 	省	市1	辽宁	大连2	辽宁	盘锦3	四川	成都4	四川	资阳5	四川	绵阳6	四川	乐山7	山东	青岛8	山东	菏泽
将每个人的技能拆分成序列展示

有时候我们会面对这种需求:一个字段中保存的是带有固定分隔符的字符串(比如", "),需要将这一行的这个字段拆分,拆分为一个数据集,这个数据集每一行都显示这个原有字段的一个值

这么说有点绕口,看图

# 基础数据import pandas as pddf = pd.DataFrame({"name": ["小明", "小红", "小陈", "小白", "小王"], "技能": ["篮球,排球,羽毛球", "乒乓球,篮球,排球", "网球,唱歌,跳舞", "b-box,篮球,足球", "网球,乒乓球,羽毛球"]})# 构造数据如下所示                                           	name	技能0	小明	篮球,排球,羽毛球1	小红	乒乓球,篮球,排球2	小陈	网球,唱歌,跳舞                         3	小白	b-box,篮球,足球4	小王	网球,乒乓球,羽毛球

需求为:需要把技能相同的人汇总一起,那么首先第一步肯定是要将每个人技能拆开,再去做聚合操作,那么拆开的结果应该是如下图所示的

# 将小明的技能分开展示,小红,小陈也是如此name	技能-分开0	小明	篮球0	小明	排球0	小明	羽毛球1	小红	乒乓球1	小红	篮球1	小红	排球2	小陈	网球2	小陈	唱歌2	小陈	跳舞3	小白	b-box3	小白	篮球3	小白	足球4	小王	网球4	小王	乒乓球4	小王	羽毛球

实现代码

# 用到了拼接和转置的操作df=df.drop('技能', axis=1).join(df['技能'].str.split(',', expand=True).stack().reset_index(level=1, drop=True).rename('技能-分开'))
只关注各省份TOP2的记录

需求描述:我想将数据根据一定的要求分类并排序,然后取每个分组后排序的前两条记录

举例来说就是,如下

import numpy as npimport pandas as pddf = pd.DataFrame({"省": ["辽宁", "辽宁", "辽宁", "四川", "四川", "四川", "四川", "山东", "山东"], "市": ["沈阳", "大连", "盘锦", "成都", "资阳", "绵阳","乐山", "青岛", "菏泽"]})# 根据数据集大小将某列生成随机模拟数df["篮球场个数"] = np.random.randint(1000000, 5000000, size=len(df))# 数据如下所示	省	市	篮球场个数0	辽宁	沈阳	46977371	辽宁	大连	35509602	辽宁	盘锦	31546603	四川	成都	11748384	四川	资阳	44091975	四川	绵阳	21882126	四川	乐山	16097227	山东	青岛	37247358	山东	菏泽	2102416

需求为:展示每个省篮球场个数最多的前两个市,展示如下

# 每个省市只展示前两名的数据集	省	市	篮球场个数0	辽宁	沈阳	46977371	辽宁	大连	35509603	四川	成都	11748384	四川	资阳	44091977	山东	青岛	37247358	山东	菏泽	2102416

之前我计算这个,要用for循环迭代去取值,后面了解到了这个方法,效率提升了几倍,怎么写,如下所示

# 先排名,根据省市和篮球场个数,要加上inplace=True, 不然没有更改原表的顺序df.sort_values(by=["省", "篮球场个数"], ascending=False, inplace=True)print(df)# 根据省份分组,并取每个组的前两条记录,则为排名前两名的记录,一定要用变量接受结果tmp_df = df.groupby(by=["省"]).head(2)

标签: #使用python进行数据分析