pandas(进阶操作)-- 处理非数值型数据 -- 数据分析三剑客(核心)

博客地址:https://www.cnblogs.com/zylyehuo/

开发环境

  • anaconda
    • 集成环境:集成好了数据分析和机器学习中所需要的全部环境
    • 安装目录不可以有中文和特殊符号
  • jupyter
    • anaconda提供的一个基于浏览器的可视化开发工具
python 复制代码
import numpy as np
import pandas as pd
from pandas import DataFrame

替换操作

  • 替换操作可以同步作用于Series和DataFrame中
  • 单值替换
    • 普通替换: 替换所有符合要求的元素:to_replace=15,value='e'
    • 按列指定单值替换: to_replace={列标签:替换值} value='value'
  • 多值替换
    • 列表替换: to_replace=[] value=[]
    • 字典替换(推荐) to_replace=
python 复制代码
df = DataFrame(data=np.random.randint(0,100,size=(5,6)))
df
python 复制代码
df.replace(to_replace=0,value='Zero')
python 复制代码
df.replace(to_replace={10:'Ten'})
python 复制代码
# 将指定列的元素进行替换to_replase={列索引:被替换的值}
df.replace(to_replace={3:0},value='Zero')

映射操作(重点)

  • 概念:创建一个映射关系列表,把values元素和一个特定的标签或者字符串绑定(给一个元素值提供不同的表现形式)
  • 创建一个df,两列分别是姓名和薪资,然后给其名字起对应的英文名
python 复制代码
dic = {
    'name':['张三','李四','张三'],
    'salary':[15000,20000,15000]
}
df = DataFrame(data=dic)
df
python 复制代码
# 映射关系表
dic = {
    '张三':'tom',
    '李四':'jack'
}
python 复制代码
# map是Series的方法,只能被Series调用
df['e_name'] = df['name'].map(dic)
df

运算工具

  • 超过3000部分的钱缴纳50%的税,计算每个人的税后薪资
python 复制代码
# 该函数是我们指定的一个运算法则
def after_sal(s):#计算s对应的税后薪资
    return s - (s-3000)*0.5
python 复制代码
# map是Series的方法,只能被Series调用    
df['after_sal'] = df['salary'].map(after_sal)  # 可以将df['salary']这个Series中每一个元素(薪资)作为参数传递给s
df

排序实现的随机抽样

  • take()
  • np.random.permutation()
python 复制代码
df = DataFrame(data=np.random.randint(0,100,size=(100,3)),columns=['A','B','C'])
df
python 复制代码
# 生成乱序的随机序列
np.random.permutation(10)
python 复制代码
array([8, 9, 6, 2, 5, 3, 1, 0, 7, 4])

将原始数据打乱

打乱列

python 复制代码
# [2,0,1] 只能使用隐式索引
# df.take([2,0,1],axis=1)
df.take(np.random.permutation(3),axis=1)

打乱行

python 复制代码
df.take(np.random.permutation(3),axis=1).take(np.random.permutation(100),axis=0)[0:50]
df.take(np.random.permutation(3),axis=1).take(np.random.permutation(100),axis=0)[0:50].head()

数据的分类处理(重点)

  • 数据分类处理的核心:
    • groupby()函数
    • groups属性查看分组情况
python 复制代码
df = DataFrame({'item':['Apple','Banana','Orange','Banana','Orange','Apple'],
                'price':[4,3,3,2.5,4,2],
               'color':['red','yellow','yellow','green','green','green'],
               'weight':[12,20,50,30,20,44]})
df

按指定属性进行分类

python 复制代码
# 对水果的种类进行分类
df.groupby(by='item')
python 复制代码
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x00000290D4BAA910>

查看详细的分组情况

python 复制代码
df.groupby(by='item').groups
python 复制代码
{'Apple': [0, 5], 'Banana': [1, 3], 'Orange': [2, 4]}

分组聚合

计算出每一种水果的平均价格

python 复制代码
df.groupby(by='item')['price'].mean()
python 复制代码
item
Apple     3.00
Banana    2.75
Orange    3.50
Name: price, dtype: float64

计算每一种颜色对应水果的平均重量

python 复制代码
df.groupby(by='color')['weight'].mean()
python 复制代码
color
green     31.333333
red       12.000000
yellow    35.000000
Name: weight, dtype: float64
python 复制代码
dic = df.groupby(by='color')['weight'].mean().to_dict()
dic
python 复制代码
{'green': 31.333333333333332, 'red': 12.0, 'yellow': 35.0}

将计算出的平均重量汇总到源数据

python 复制代码
df['mean_w'] = df['color'].map(dic)
df

高级数据聚合

  • 使用groupby分组后,也可以使用transform和apply提供自定义函数实现更多的运算
  • df.groupby('item')['price'].sum() <==> df.groupby('item')['price'].apply(sum)
  • transform和apply都会进行运算,在transform或者apply中传入函数即可
  • transform和apply也可以传入一个lambda表达式
python 复制代码
def my_mean(s):
    m_sum = 0
    for i in s:
        m_sum += i
    return m_sum / len(s)
python 复制代码
df.groupby(by='item')['price'].transform(my_mean)  # 返回的是经过映射的结果
python 复制代码
0    3.00
1    2.75
2    3.50
3    2.75
4    3.50
5    3.00
Name: price, dtype: float64
python 复制代码
df.groupby(by='item')['price'].apply(my_mean)  # 返回的是未经过映射的结果
python 复制代码
item
Apple     3.00
Banana    2.75
Orange    3.50
Name: price, dtype: float64

数据加载

  • 读取type-.txt文件数据
python 复制代码
df = pd.read_csv('./data/type-.txt')
df
python 复制代码
df.shape
python 复制代码
(2, 1)

将文件中每一个词作为元素存放在DataFrame中

python 复制代码
pd.read_csv('./data/type-.txt',header=None,sep='-')

读取数据库中的数据

连接数据库,获取连接对象

python 复制代码
import sqlite3 as sqlite3
conn = sqlite3.connect('./data/weather_2012.sqlite')

读取库表中的数据值

python 复制代码
sql_df=pd.read_sql('select * from weather_2012',conn)
sql_df

将一个df中的数据值写入存储到db

python 复制代码
df.to_sql('sql_data456',conn)
python 复制代码
2

透视表(重点)

  • 透视表是一种可以对数据动态排布并且分类汇总的表格格式。或许大多数人都在Excel使用过数据透视表,也体会到它的强大功能,而在pandas中它被称作pivot_table。
  • 透视表的优点:
    • 灵活性高,可以随意定制你的分析计算要求
    • 脉络清晰易于理解数据
    • 操作性强,报表神器
python 复制代码
import pandas as pd
import numpy as np
python 复制代码
df = pd.read_csv('./data/透视表-篮球赛.csv',encoding='utf8')
df

pivot_table有四个最重要的参数index、values、columns、aggfunc

index参数:分类汇总的分类条件

  • 每个pivot_table必须拥有一个index。如果想查看哈登对阵每个队伍的得分则需要对每一个队进行分类并计算其各类得分的平均值:
  • 想看看哈登对阵同一对手在不同主客场下的数据,分类条件为对手和主客场
python 复制代码
df.pivot_table(index=['对手','主客场'])

values参数:需要对计算的数据进行筛选

  • 如果我们只需要哈登在主客场和不同胜负情况下的得分、篮板与助攻三项数据
python 复制代码
df.pivot_table(index=['主客场','胜负'],values=['得分','篮板','助攻'])

Aggfunc参数:设置我们对数据聚合时进行的函数操作

  • 当我们未设置aggfunc时,它默认aggfunc='mean'计算均值。
  • 还想获得james harden在主客场和不同胜负情况下的总得分、总篮板、总助攻时
python 复制代码
df.pivot_table(index=['主客场','胜负'],values=['得分','篮板','助攻'],aggfunc='sum')

Columns:可以设置列层次字段

  • 对values字段进行分类
python 复制代码
# 获取所有队主客场的总得分
df.pivot_table(index='主客场',values='得分',aggfunc='sum')
python 复制代码
# 获取每个队主客场的总得分(在总得分的基础上又进行了对手的分类)
# fill_value=0 空值补0
df.pivot_table(index='主客场',values='得分',columns='对手',aggfunc='sum',fill_value=0)

交叉表

  • 是一种用于计算分组的特殊透视图,对数据进行汇总
  • pd.crosstab(index,colums)
    • index:分组数据,交叉表的行索引
    • columns:交叉表的列索引
python 复制代码
import pandas as pd
from pandas import DataFrame
python 复制代码
df = DataFrame({'sex':['man','man','women','women','man','women','man','women','women'],
               'age':[15,23,25,17,35,57,24,31,22],
               'smoke':[True,False,False,True,True,False,False,True,False],
               'height':[168,179,181,166,173,178,188,190,160]})
df

求出各个性别抽烟的人数

python 复制代码
# pd.crosstab(行索引,列索引)
pd.crosstab(df.smoke,df.sex)

求出各个年龄段抽烟人情况

python 复制代码
pd.crosstab(df.age,df.smoke)
相关推荐
CC数学建模33 分钟前
被问爆的 “高颜值 + 强功能” 学生管理系统!Flask+MySQL 全栈开发,自带数据分析 + 幸福指标,毕设 / 竞赛直接
mysql·数据分析·flask
咚咚王者3 小时前
人工智能之数据分析 Matplotlib:第四章 图形类型
人工智能·数据分析·matplotlib
语落心生5 小时前
大宗供应链企业舆情指标系统设计(一)舆情指标设计
数据分析
语落心生5 小时前
餐饮供应链的数仓设计思考 (五) 系统稳定性与SLA保障体系
数据分析
语落心生6 小时前
餐饮供应链的数仓设计思考 (四) 餐饮连锁企业数据模型可解释性
数据分析
语落心生6 小时前
餐饮供应链的数仓设计思考 (三) 数据管道与核心系统API对接方案
数据分析
语落心生6 小时前
餐饮供应链的数仓设计思考 (二) 餐饮连锁企业深度业务模型分析
数据分析
语落心生6 小时前
餐饮供应链的数仓设计思考 (一) 系统设计大纲
数据分析
用户41429296072397 小时前
批量商品信息采集工具获取商品详情的完整方案
爬虫·数据挖掘·数据分析
用户41429296072398 小时前
淘宝实时商品API接口:采集竞品商品详情页的价格、SKU 规格、库存数量、卖点文案、图文内容、售后政策(运费、退换货规则)、评价核心标签
数据挖掘·数据分析·数据可视化