数据分析进阶 - pandas在数据分析中的应用

前言

记得在去年的时候写过一篇关于pandas包的简单使用,具体可见链接,但是经过这段时间的学习或者工作,觉得有点低估了pandas能够在分析中发挥的作用,所以这篇博客将对数据分析整个流程中pandas的使用做一个梳理(不会特别全,但是是比较常用的,后续若有补充会进行更新)。

分析流程

数据读取

由于数据存储的形式是多样的,例如在数据库或者导出的文档中,pandas提供了多种读取数据的方法,下面仅讲解最为常见的三种形式

import pandas as pd
# Excel
df = pd.read_excel('test.xlxs')
# Csv or txt
# 方法中有挺多有利于数据处理的参数设置,具体可以在实操中根据需要学习即可,例如
# header是否首行设为列名,skiprows要跳过多少行, 空值处理以及时间处理等
df = pd.read_csv('test.csv', sep=",") # 常见的csv文件分割符就是逗号,但要按具体文档,可能是/t等
df = pd.read_csv('test.txt', sep=" ") # txt文件可以用此方法,也需要注意分割符
# Sql
# 过去比较常用上面两种形式,然而在工作中也尝试了直接从数据库提取,因此重点讲此方法
# 对于低版本的pandas可用pymysql
import pymysql
conn = pymysql.connect(host="127.0.0.1",user="root",password="password",db="data")
sql = "select * from data"
df = pd.read_sql(sql, conn)
conn.close() # 取完数据后还是要记得关闭连接

# 对于高版本的pandas会有很大的不同,主要是使用了sqlalchemy
from sqlalchemy import create_engine
engine = "mysql+pymysql://用户名:密码@IP/数据库名?charset=utf8"
sql = "select * from data"
df = pd.read_sql(sql, engine)
数据提取

上一个步骤取出的数据是DataFrame的形式,相当于一个数据表格,如果我们需要对特定的数据进行处理的话,主要有以下的方式

# 查看首尾数据,可加参数n控制行数
df.head()
df.tail()
# 特定列 - test为列名
df.test
df['test']
df[0] # 列数
# 多列
df[['test1', 'test2']]
# 索引 - [行,列]
df.loc[]   # 通过行标签
df.iloc[]  # 通过行号
df.ix[] # loc和iloc的混合
# 查询式 - 类似Excel的筛选
df.query("条件")  # 单条件
df[(条件1) & (条件2)] # 多条件
df[~df.test.isin(data)]   # ~取反
数据预处理
# 列名重命名
df.rename(columns={'列1':'新列1', '列2':'新列2'}
# 了解数据
# 查看数据全貌,包括数据类型、空值、统计值等
df.describe()  
df.info()
df.shape
# 空值、重复值处理
# 确定缺失值
df.notnull()
df.isnull()
df.isnull().any() # 获取含有空值的列
df.isnull().all() # 全部为空值的列

# 填充为0 或者均值、中位数
df.fillna(0)   
df.dropna() # 直接丢弃含有NA的行记录

# 重复
df.duplicated() # 判断重复数据记录
df.drop_duplicates() # 删除数据记录中所有列值相同的记录
df.drop_duplicates(subset=['A'],keep='first')  # 指定式删除重复 
df.drop_duplicates(['col1']) # 删除数据记录中col1值相同的记录
# 数据转置
df.T
# 时间处理
pd.date_range() # 生成时间序列
pd.to_datetime(df.dates) # 转换为datetime对象

# 也可在读取数据的时候提前修改
df = pd.read_csv('test.csv', parse_dates=['dates'])
# 修改数据类型
df.dtypes # 看数据类型
df['test'] = df['test'].astype('float64')  # 单个处理
df=df.astype({'列1':'float64','列2':'float64'}) # 多个处理
# 数据合并、连接
df.append()  # 叠加
pd.concat()  # 单纯的把两个表拼接在一起,用axis指定行列,不去重
pd.merge() # 类似于关系型数据库的连接方式(即join)
pd.join()  # 用于索引的合并
数据统计&函数应用
# 数据聚合
df.groupby('test')
df.groupby(['列1’,'列2']
# 统计计算
count() # 显示非Nan值的数据项数量
median() # 中位数
max() # 最大值
min() # 最小值
mode() # 众数
std() # 标准差
var() # 方差
# 函数应用 - 搭配numpy
# apply - 可对单列或者多列处理
df.apply(sum)
df.['列1'].apply(lamda x: np.square(x) if x == 2 else x) # 最常搭配匿名函数
df['dates'].apply(pd.to_datetime)  # 也可在此对日期进行处理,方便计算

# agg - 类似apply,但可以指定不同的列用不同的函数
df.groupby(['列1']).agg([sum,mean,max])
df.groupby(['列1']).agg({'列1':sum,'列2':np.mean})
# 数据透视表(类似Excel的操作)
# index为行,column为列,aggfunc相当于函数
pd.pivot_table(df, index=['列1', '列2'], columns=['列3'], aggfunc=[np.mean, np.sum, max])
数据可视化
import matplotlib.pyplot as plt
df.plot(x = "a", y = "b")
# 不同的图形可用kind参数设置
df.plot.bar()  # 条形图
df.plot.hist(bins=20)  # 直方图
df.plot.box()  # 箱线图
df.plot.area() # 面积图
df.plot.scatter(x='a', y='b') # 散点图
df.plot.pie(subplots=True)  # 饼图
plt.show()
数据存储
df.to_csv('result.csv', sep=',', index=None)
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值