热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

30个Python技巧,加速你的数据分析处理速度

pandas的下载使用命令下载:pipinstallpandas或者自行下载whl文件安装https:www.lfd.uci.edu~gohlkepytho

30 个 Python 技巧,加速你的数据分析处理速度

pandas的下载

 

使用命令下载:

pip install pandas 

 

 

或者自行下载whl文件安装

https://www.lfd.uci.edu/~gohlke/pythonlibs/

 

 

创建DataFrame数据

pd_data = pd.DataFrame({
    "name":["小明","小红","小孙","王小","关宇","刘蓓","张菲"],
    "age":[20,18,27,20,28,18,25],
    "sex":["","","","","","",""],
    "score":[669,570,642,590,601,619,701],
    "address":["北京","深圳","广州","武汉","深圳","广州","长沙"]
})

print(pd_data)

 

读取本地文件

 

pd_data = pd.read_excel("./测试.xlsx")

pd.set_option("display.max_columns", None)   # 显示完整的列
pd.set_option("display.max_rows", None)  # 显示完整的行
pd.set_option("display.expand_frame_repr", False)  # 设置不折叠数据

print(pd_data)

 

 

查看数据是否有缺失

# 如果缺失显示为True,否则显示False
isnull = pd_data.isnull()        
print(isnull)

 

 

统计缺失值个数

# 统计缺失值个数
null_count = pd_data.isnull().sum()
print(null_count)

 

 

缺失值填充

# 填充数据 我选择了8.888,你随意
pd_data.fillna(8.888, inplace=True)
print(pd_data)

 

 

缺失值删除

# 如果有缺失值,删除此行
exist_col = pd_data.dropna()
print(exist_col)

 

 

查看头尾文件

# 查看头尾文件
print("头文件:", pd_data.head())
print("尾文件:", pd_data.tail())

 

 

取单列值

# 单列值
pd_data = pd.read_excel("./测试.xlsx")
print(pd_data["全款价"])

 

 

取多列值

# 多列值
pd_data = pd.read_excel("./测试.xlsx")
print(pd_data[["车辆概况", "全款价"]])

 

 

单条件取值

pd_data = pd.read_excel("./测试.xlsx")
print(pd_data[pd_data["全款价"] == 4])
print("-"*100)
print(pd_data[pd_data["汽车排量"] == "2.0T"])

 

 

多条件取值-与

# 多条件筛选数据
print(pd_data[(pd_data["车龄"] == "2018年") & (pd_data["变速箱"] == "自动")])

 

 

多条件取值-或

# 多条件筛选数据
print(pd_data[(pd_data["车龄"] == "2018年") | (pd_data["变速箱"] == "自动")])

 

 

字符串的开始函数

# 找出在 车辆概况 中以"大众"开头的
cars = pd_data[pd_data["车辆概况"].str.startswith("大众")]
print(cars)

 

 

字符串的结尾函数

# 找出在 车辆概况 中以"豪华型"结尾的
cars = pd_data[pd_data["车辆概况"].str.endswith("豪华型")]
print(cars)

 

字符串的包含函数‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

# 找出在 车辆概况 中包含"进口"的
cars = pd_data[pd_data["车辆概况"].str.contains("进口")]
print(cars)

统计元素个数

# 统计 过户分类 以及对应次数
trans_count = pd_data["过户情况"].value_counts()
print(trans_count)

 

 

为了便于进一步的数据分析,我希望将它们置于不同的数组之中,可以采用如下方法:

# 统计 过户分类 以及对应次数
trans_count = pd_data["过户情况"].value_counts()
# 针对于过户情况的分类
x1_data = trans_count.index.tolist()    
# 分类后各组数据的统计
x2_data = trans_count.tolist()      

print(x1_data)
print(x2_data)

这种格式的数据才是最适合做可视化分析的!

这里再多介绍两种方法,条条大路通罗马

都能轻松实现你的目标。

# 统计 过户分类 以及对应次数
trans_count = pd_data["过户情况"].value_counts()
# 针对于过户情况的分类
x1_data = trans_count.index.tolist()
x11_data = trans_count.index
x12_data = trans_count.index.values
# 类后各组数据的统计
x2_data = trans_count.tolist()
print("index.tolist():", x1_data)
print("index:", x11_data)
print("index.values:", x12_data)
print("x2:", x2_data)

 

 

分割字符串

这个功能也很实用,大家可以看看我的汽车名称数据这一列,我的目标仅仅是车名而已,后面的车型、车龄、排列、变速箱信息对我来说都是冗余信息。

非常不利于我后续数据可视化

所以字符串分割在这里就显得尤为重要。

 

 

# 对 汽车名称 这一列按照空格分割 并取第一个字符
pd_data["汽车名称"] = pd_data["车辆概况"].map(lambda x: x.split(" ")[0])
name = pd_data["汽车名称"].value_counts()
# 汽车名称分类
name1 = name.index.tolist()  
# 汽车名称对应数量
name2 = name.tolist()  
print(name1)
print(name2)

 

 

看到我取出来数据的样子了吗,要的就是这个!

清理数据

当我们相对汽车里程做进一步的分析时会发现数据后面都有一个’万公里’,这种数据要做可视化必须先对数据进行处理,

就是先要去除数字后面的字符


 

 

我们可以使用字符串的replace()方法,使用空格替换字符

 

pd_data.loc[:, "表显里程new"] = pd_data["表显里程"].str.replace("万公里", "").astype("float32")  # 去除 30 ’万公里‘
# 保存数据
pd_data.to_excel("测试1.xlsx")

 

 

黄色一列是我们处理之前的数据

绿色一列是我们处理之后的数据

已经达到了我们想要的效果

 

 

划分区间

现在有这么一个需求,我想要按照汽车的行驶里程分类,基本上每个车的行驶里程都是不一样的,如果将每个数据都反映在图标上就会看起来很冗余,

也就失去了作图的意义

所以我们可以按照区间来划分,例如5w-10w公里、10w-15w公里这样图表展示展示出来的效果就会很好了。

 

 

pd_data.loc[:, "表显里程new"] = pd_data["表显里程"].str.replace("万公里", "").astype("float32")  # 去除 30 ’万公里‘
# 划分区间
pd_data["里程区间"] = pd.cut(pd_data["表显里程new"], [0, 2, 4, 6, 8, 10, 20],
                             labels=["0-2", "2-4", "4-6", "6-8", "8-10", ">10"])
mile = pd_data["里程区间"].value_counts()
mile1 = mile.index.tolist()         # 里程区间分类
mile2 = mile.tolist()               # 里程区间分类对应数量
print(mile1)
print(mile2)

 

 

重置索引

其实我们在上面案例的演示中已经发现了,根据条件取出来的数据的索引都是处理数据之前的索引,

我们现在要重置索引的话要怎么办呢?

我们可是使用_reset_index()_来索引重置

重置索引前:

# 找出在 过户情况 中所有"0次"的汽车
cars = pd_data[pd_data["过户情况"].str.contains("0次")]
print(cars.reset_index())

 

 

重置索引后:

 

 

 

很好,但是不完美。多了一列colm name叫做 index的先前序列号。

 

不想看到它,有办法吗?

 

drop = True

# 找出在 过户情况 中所有"0次"的汽车
cars = pd_data[pd_data["过户情况"].str.contains("0次")]
print(cars.reset_index(drop=True))

 

 

 

column重命名

# 重命名
pd_data = pd_data.rename(columns = {"车辆概况":"车辆详情"})
print(pd_data)

 

 

分组统计groupby-单条件

# 统计不同变速箱总里程
pd_data.loc[:, "表显里程new"] = pd_data["表显里程"].str.replace("万公里", "").astype("float32")    # 去除 30 ’万公里‘
trans_mile = pd_data.groupby("变速箱")["表显里程new"].sum()
print(trans_mile)

 

 

分组统计groupby-多条件

# 统计不同变速箱和过户情况总里程
pd_data.loc[:, "表显里程new"] = pd_data["表显里程"].str.replace("万公里", "").astype("float32")    # 去除 30 ’万公里‘
trans_mile = pd_data.groupby(["变速箱","过户情况"])["表显里程new"].sum()
print(trans_mile)

 

 

如果再加上一个重置索引 trans_mile.reset_index()

 

 

 

求平均

# 统计不同过户次数车辆平均里程
pd_data.loc[:, "表显里程new"] = pd_data["表显里程"].str.replace("万公里", "").astype("float32")    # 去除 30 ’万公里‘
trans_mile = pd_data.groupby("过户情况")["表显里程new"].mean()
print(trans_mile.reset_index())

 

 

apply函数

还记得我们爬取大学的那个教程吗?

我们爬出来的数据如果是985或者是211显示为1,

如果非985或者211,显示为2

 

 

现在我不想要1和2了,因为我看不懂它是什么意思?如果是985或者211,就显示是,如果不是,就显示否!

pd_data = pd.read_excel("./全国高校数据.xlsx")
print(pd_data)
pd_data1 = pd_data.copy()  # 生成一个副本, 防止数据损坏
pd_data["f985"] = pd_data["f985"].apply(lambda x: "" if x == 1 else "")       # 通过匿名函数解决
pd_data["f211"] = pd_data["f985"].apply(lambda x: "" if x == 1 else "")       # 通过匿名函数解决
print(pd_data)

 

 

同理利用_lambda_函数我们还可以

给省份这一列后面加个’省’

pd_data = pd.read_excel("./全国高校数据.xlsx")
print(pd_data)
pd_data1 = pd_data.copy()  # 生成一个副本, 防止数据损坏

pd_data["province_name"] = pd_data["province_name"].apply(lambda x: x+"")       # 通过匿名函数解决
print(pd_data)
"""

 

 

同理利用_lambda_函数我们还可以给

人气值view_total这一列最后面的’w’

pd_data["view_total"] = pd_data["view_total"].apply(lambda x: x[:-1])       # 通过匿名函数解决
print(pd_data)

 

 

求最大最小值

max_view_total = pd_data[pd_data["view_total"] == pd_data["view_total"].max()]
print(max_view_total)

 

 

min_view_total = pd_data[pd_data["view_total"] == pd_data["view_total"].min()]
print(min_view_total)

 

 

时间提取

 

为了便于演示,我加上了一列 Date 选项,如下:

 

 

 

现在我们想提取其中的年份或者月份,我们可以使用 "DatetimeIndex’这个方法来实现。

pd_data = pd.read_excel("./全国高校数据.xlsx")
pd_data["year"] = pd.DatetimeIndex(pd_data["Date"]).year
pd_data["month"] = pd.DatetimeIndex(pd_data["Date"]).month
pd_data["day"] = pd.DatetimeIndex(pd_data["Date"]).day
print(pd_data)

 

 

增加列

 

我想把刚才的生成的年+月+日方法到前三列,可以使用insert()方法来实现

Year = pd.DatetimeIndex(pd_data["Date"]).year
Month = pd.DatetimeIndex(pd_data["Date"]).month
day = pd.DatetimeIndex(pd_data["Date"]).day
pd_data.insert(0, "Year", Year)
pd_data.insert(1, "Month", Month)
pd_data.insert(2, "day", day)
print(pd_data)

 

 


推荐阅读
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • Day2列表、字典、集合操作详解
    本文详细介绍了列表、字典、集合的操作方法,包括定义列表、访问列表元素、字符串操作、字典操作、集合操作、文件操作、字符编码与转码等内容。内容详实,适合初学者参考。 ... [详细]
author-avatar
鑫瑜Twinkle
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有