python-df的归并与Matplotlib绘图

打印 上一主题 下一主题

主题 1008|帖子 1008|积分 3024

1 数据连接 concat merge join (append 作为相识)



  • append 竖直方向追加, 在最新的pandas版本中已经被删除掉了, 这里推荐利用concat
1.1 pd.concat

两张表, 通过行名、列名对齐举行连接
  1. import pandas as pd
  2. df1 = pd.DataFrame([[1, 2, 3], [1, 10, 20], [5, 6, 7], [3, 9, 0], [8, 0, 3]], columns=['x1', 'x2', 'x3'])
  3. df2 = pd.DataFrame([[1, 2], [1, 10], [1, 3], [4, 6], [3, 9]], columns=['x1', 'x4'])
  4. pd.concat([df1, df2], axis=1)
  5. pd.concat([df1, df2],join='inner')
复制代码
  axis=1 默认是0 , 上下连接, 用列名做对齐 = 1 左右连接 用行名对齐
  join = 'inner' 默认 ‘outer’ outer 会生存连接的两张表的全部的信息, 有列名、行名不匹配的时间, 用NaN添补, 如果是inner 只会连接 行名、列名相同的部分
  1.2 merge 连接 类似于SQL的join

  1. # 写法1
  2. df1.merge(df2, on='列名', how='固定值')
  3. # 写法2
  4. pd.merge(df1, df2, on='列名', how='固定值')
复制代码


  • merge函数有2种常用参数,参数说明如下

    • 参数on='列名',表示基于哪一列的列值举行归并利用
    • 参数how='固定值',表示归并后怎样处置惩罚行索引,固定参数具体如下:

      • how='left' 对应SQL中的left join,生存左侧表df1中的全部数据
      • how='right' 对应SQL中的right join,生存右侧表df2中的全部数据
      • how='inner' 对应SQL中的inner,只生存左右两侧df1和df2都有的数据
      • how='outer' 对应SQL中的join,生存左右两侧侧表df1和df2中的全部数据


  • merge横向连接多个关联数据集具体利用
    1. df3 = pd.merge(df1, df2, how='left', on='x1')
    2. df4 = pd.merge(df1, df2, how='right', on='x1')
    3. df5 = pd.merge(df1, df2, how='inner', on='x1')
    4. df6 = pd.merge(df1, df2, how='outer', on='x1')
    复制代码
  1. df1.merge(df2, left_on='x1', right_on='x4', how='inner',suffixes=('_left', '_right'))
复制代码
  两张表要关联的字段名字差别, left_on 左表用于关联的字段名 right_on 右表用于关联的字段名
  suffixes 后缀, 当关联效果中,出现了同名的字段, 用于区分哪个字段来自于哪一张表, 默认是(' _ x', '_ y')
  1.3 join归并

  1. df1.join(df2,lsuffix='left',rsuffix='right')
复制代码
  如果这里不写on 这个参数, 和pd.concat axis=1 的时间完全相同
  1. df1.join(df2,on='x1',lsuffix='left',rsuffix='right')
复制代码
  df1 用x1 和 df2的index 做join 左表的一列数据和右表的行索引 举行归并
  join功能可以用concat 和 merge 替代。 这部分作为相识就可以了
2 转置和透视表

df.T 行变列, 列变行
2.1 透视表



  • 盘算的效果可以通过分组聚合来实现, 只不过是展示的方式跟分组聚合有差异
  • 统计每个城市线下门店各种品类商品总销售额
  1. uniqlo_df_offline = uniqlo_df[uniqlo_df['销售渠道']=='线下'] # 筛选出线下的销售数据
  2. result_df = uniqlo_df_offline.groupby(['城市','产品名称'])['销售金额'].sum()
  3. # 通过分组聚合统计不同城市不同产品的总销售额
复制代码


  • 通过透视表实现
  1. uniqlo_df_offline.pivot_table(index='城市',columns='产品名称',values='销售金额',aggfunc='sum')
复制代码
  index 分组字段之一, 在效果中作为行索引
  columns 分组字段之一, 在透视表效果中作为列名
  values 聚合字段, 在透视表的效果中展示在值的位置上
  aggfunc 聚合函数, 对聚合字段利用的统计函数名字
  需要注意的是, index columns values 都可以传列表, aggfunc 可以针对差别的value 选择差别的聚合方式, 此时需要传入字典 但是不推荐把表做的过于复杂
  
df.groupby()[].mean()
df['列名'].value_counts()
df['列名'].unique()
df.sort_values()
df.drop()
df.drop_duplicates()
pd.cut()
pd.to_datetime() 转日期时间范例


  • s[日期].dt.year weekday
df.merge()
pd.concat()
df.head()
df.info()
df.describe()
df[''].apply()
df.loc /df.iloc
max() min() mean() count() sum() std() quantile() df.corr()
根据条件筛选数据
分组聚合
pd.cut()

3 Matplotlib数据可视化

数据可视化的库一共有两类
基于Matplotlib的, 绘制的是静态的图形


  • pandas
  • seaborn
用javascript 实现的 比如 echarts → pyecharts plotly


  • 随着利用的时间再去讲
对大家的要求


  • 知道什么场景选择什么样的图表
  • 代码能够看懂, 基于已有的代码可以修改实现本身想要的效果
3.1 Matplotlib 的绘图套路

  1. import pandas as pd
  2. import matplotlib.pyplot as plt
  3. x = [-3, 5, 7] #准备数据的x轴坐标
  4. y = [10, 2, 5] #准备数据的y轴坐标
  5. # 面向过程的API 通过plt 绘图工具, 调用方法, 画图
  6. plt.figure(figsize=(15,3)) # 创建绘图区域  figsize指定区域大小  15 宽度 3高度
  7. plt.plot(x, y)
  8. plt.xlim(-8,8)
  9. plt.xlabel('X Axis',size=15)   # 设置X轴的标题
  10. plt.ylabel('Y Axis',size=10)  # 设置Y轴标题
  11. plt.title('Line plot',size=15) # 添加 图大标题
  12. plt.grid(True) # 网格线
  13. plt.show()
  14. # 面向对象的API  先获取坐标轴的对象, 通过坐标轴对象调用方法 设置属性
  15. fig,ax = plt.subplots(figsize=(15,3)) # 返回fig ax(坐标轴)
  16. ax.plot(x,y)
  17. ax.set_xlim(-3,8)
  18. ax.set_ylim(-3,8)
  19. ax.set_xlabel('X Axis',size=15)
  20. ax.set_ylabel('Y Axis',size=10)
  21. ax.set_title('Line plot',size=15)
  22. plt.show()
复制代码
  基本套路
  import matplotlib.pyplot as plt
  plt.figure(figsize=(15,3))
  plt.plot(x, y)
  plt.show()
  3.2 单变量可视化——绘制直方图

这里利用seaborn提供的餐馆小费数据
  1. tips = pd.read_csv('C:/Develop/顺义48/day01/02_代码/data/tips.csv')
复制代码
对餐馆消费账单的分布情况举行可视化
  1. # 单变量的分布 可以绘制直方图
  2. plt.figure(figsize=(16,8))
  3. plt.hist(tips['total_bill'],bins=8)
  4. # 直方图使用场景, 单独的取值是连续值(数值型) 变量,看这个变量的分布情况就可以选择直方图
  5. # 绘制的过程, 把数据从小到大排序, bins 数量决定了数据要分成几组, 分组的方式等距分组(每组的上下边界的差值尽可能一样)
  6. # 统计落在每一组的数据的条目数, 通过一个柱状图绘制出来,一个柱子代表一组, 柱子的高度取决于这一组有多少条数据
复制代码


3.3 双变量可视化 ——散点图

  1. plt.figure(figsize=(8,6))
  2. plt.scatter(tips['total_bill'],tips['tip'])
  3. plt.xlabel('Total Bill')
  4. plt.ylabel('Tip')
  5. plt.show()
复制代码

散点图的利用场景
  1. # 散点图使用场景 两个连续型变量 发现他们之间是否存在关联( 一个变量是否随着另一个变量的变化而变化)
  2. # scatter 一个变量作为x轴坐标, 另一个变量做为y轴坐标
复制代码

4 pandas 数据可视化

pandas 集成了Matplotlib, 画图功能就是对Matplotlib的封装
画图API
  1. df1.plot()  # 默认折线图
  2. df1['x'].plot.bar()
  3. # df.plot.line() # 折线图的全写方式
  4. # df.plot.bar() # 柱状图
  5. # df.plot.barh() # 横向柱状图 (条形图)
  6. # df.plot.hist() # 直方图
  7. # df.plot.box() # 箱形图
  8. # df.plot.kde() # 核密度估计图
  9. # df.plot.density() # 同 df.plot.kde()
  10. # df.plot.area() # 面积图
  11. # s.plot.pie() # 饼图
  12. # df.plot.scatter() # 散点图
  13. # df.plot.hexbin() # 六边形箱体图,或简称六边形图
  14. plt.show()
复制代码
柱状图


  • 多个种别, 取值差别在一起比大小
  • 举例利用小费数据, 统计周四周五周六周日, 均匀账单金额
  1. # 对day 进行分组, 对账单总金额求平均, 结果会返回Series 这里直接使用了Series的绘图API
  2. tips.groupby('day')['total_bill'].mean().plot(kind='bar')
复制代码
  Series 调用plot方法, index 会作为x轴坐标 值values 会作为y轴坐标
  
  饼图


  • 团体部分的关系, 全部的部分加到一起肯定构成一个团体
  1. tips.groupby('day')['total_bill'].sum().plot(kind='pie',autopct='%.2f%%')
复制代码
  假设这个餐馆每周只有周四到周日营业, 统计一下数据会合这段时间内, 周四~周日, 哪一天销售额占比更高
  
  箱线图

蜂巢图 作为相识


  • 作用和散点图类似, 当数据量比力大的时间, 绘制散点图, 好多点会重复绘制到相同的位置, 普通的散点图不能读出这个信息来
  1. movie_df = pd.read_csv('C:/Develop/顺义48/day01/02_代码/data/movie.csv')
  2. # 加载电影数据, 查看收入gross 和 imdb_score 之间是否有关
  3. # 绘制散点图,有些点覆盖到一起了
  4. movie_df.plot.scatter(x='gross',y='imdb_score',figsize=(18,10))
复制代码

绘制蜂巢图
  1. movie_df.plot.hexbin(x='gross',y='imdb_score',figsize=(18,10),gridsize=20)
  2. # 下图中, 颜色深的部分数据量比较大
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

北冰洋以北

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表