本文示例数据下载,密码:vwy3

import pandas as pd

# 数据是之前在cnblog上抓取的部分文章信息
df = pd.read_csv('./data/SQL测试用数据_20200325.csv',encoding='utf-8') # 为了后续演示,抽样生成两个数据集 df1 = df.sample(n=500,random_state=123)
df2 = df.sample(n=600,random_state=234) # 保证有较多的交集
# 比例抽样是有顺序的,不加random_state,那么两个数据集是一样的

行的union

pandas 官方教程

pd.concat

pd.concat主要参数说明:

  • 要合并的dataframe,可以用[]进行包裹,e.g. [df1,df2,df3];
  • axis=0,axis是拼接的方向,0代表行,1代表列,不过很少用pd.concat来做列的join
  • join='outer'
  • ignore_index: bool = False,看是否需要重置index

如果要达到union all的效果,那么要拼接的多个dataframe,必须:

  • 列名名称及顺序都需要保持一致
  • 每列的数据类型要对应

如果列名不一致就会产生新的列

如果数据类型不一致,不一定报错,要看具体的兼容场景

df2.columns

输出:

Index(['href', 'title', 'create_time', 'read_cnt', 'blog_name', 'date', 'weekday', 'hour'], dtype='object')

# 这里故意修改下第2列的名称
df2.columns = ['href', 'title_2', 'create_time', 'read_cnt', 'blog_name', 'date','weekday', 'hour'] print(df1.shape,df2.shape) # inner方法将无法配对的列删除
# 拼接的方向,默认是就行(axis=0)
df_m = pd.concat([df1,df2],axis=0,join='inner') print(df_m.shape)

输出:

(500, 8) (600, 8)

(1100, 7)

# 查看去重后的数据集大小
df_m.drop_duplicates(subset='href').shape

输出:

(849, 7)

df.append

和pd.concat方法的区别:

  • append只能做行的union
  • append方法是outer join

相同点:

  • append可以支持多个dataframe的union
  • append大致等同于 pd.concat([df1,df2],axis=0,join='outer')
df1.append(df2).shape

输出:

(1100, 9)

df1.append([df2,df2]).shape

输出:

(1700, 9)

列的join

pd.concat

pd.concat也可以做join,不过关联的字段不是列的值,而是index

也因为是基于index的关联,所以pd.concat可以对超过2个以上的dataframe做join操作

# 按列拼接,设置axis=1
# inner join
print(df1.shape,df2.shape) df_m_c = pd.concat([df1,df2], axis=1, join='inner') print(df_m_c.shape)

输出:

(500, 8) (600, 8)

(251, 16)

这里是251行,可以取两个dataframe的index然后求交集看下

set1 = set(df1.index)
set2 = set(df2.index) set_join = set1.intersection(set2) print(len(set1), len(set2), len(set_join))

输出:

500 600 251

pd.merge

pd.merge主要参数说明:

  • left, join操作左侧的那一个dataframe
  • right, join操作左侧的那一个dataframe, merge方法只能对2个dataframe做join
  • how: join方式,默认是inner,str = 'inner'
  • on=None 关联的字段,如果两个dataframe关联字段一样时,设置on就行,不用管left_on,right_on
  • left_on=None 左表的关联字段
  • right_on=None 右表的关联字段,如果两个dataframe关联字段名称不一样的时候就设置左右字段
  • suffixes=('_x', '_y'), join后给左右表字段加的前缀,除关联字段外
print(df1.shape,df2.shape)

df_m = pd.merge(left=df1, right=df2\
,how='inner'\
,on=['href','blog_name']
) print(df_m.shape)

输出:

(500, 8) (600, 8)

(251, 14)

print(df1.shape,df2.shape)

df_m = pd.merge(left=df1, right=df2\
,how='inner'\
,left_on = 'href',right_on='href'
) print(df_m.shape)

输出:

(500, 8) (600, 8)

(251, 15)

# 对比下不同join模式的区别
print(df1.shape,df2.shape) # inner join
df_inner = pd.merge(left=df1, right=df2\
,how='inner'\
,on=['href','blog_name']
) # full outer join
df_full_outer = pd.merge(left=df1, right=df2\
,how='outer'\
,on=['href','blog_name']
) # left outer join
df_left_outer = pd.merge(left=df1, right=df2\
,how='left'\
,on=['href','blog_name']
) # right outer join
df_right_outer = pd.merge(left=df1, right=df2\
,how='right'\
,on=['href','blog_name']
)
print('inner join 左表∩右表:' + str(df_inner.shape))
print('full outer join 左表∪右表:' + str(df_full_outer.shape))
print('left outer join 左表包含右表:' + str(df_left_outer.shape))
print('right outer join 右表包含左表:' + str(df_right_outer.shape))

输出:

(500, 8) (600, 8)

inner join 左表∩右表:(251, 14)

full outer join 左表∪右表:(849, 14)

left outer join 左表包含右表:(500, 14)

right outer join 右表包含左表:(600, 14)

df.join

df.join主要参数说明:

  • other 右表
  • on 关联字段,这个和pd.concat做列join一样,是关联index的
  • how='left'
  • lsuffix='' 左表后缀
  • rsuffix='' 右表后缀
print(df1.shape,df2.shape)

df_m = df1.join(df2, how='inner',lsuffix='1',rsuffix='2')

df_m.shape

输出:

(500, 8) (600, 8)

(251, 16)

行列转置

pandas 官方教程

# 数据准备
import math
df['time_mark'] = df['hour'].apply(lambda x:math.ceil(int(x)/8)) df_stat_raw = df.pivot_table(values= ['read_cnt','href']\
,index=['weekday','time_mark']\
,aggfunc={'read_cnt':'sum','href':'count'}) df_stat = df_stat_raw.reset_index()
df_stat.head(3)

如上所示,df_stat是两个维度weekday,time_mark

以及两个计量指标 href, read_cnt

pivot

# pivot操作中,index和columns都是维度
res = df_stat.pivot(index='weekday',columns='time_mark',values='href').reset_index(drop=True)
res

stack & unstack

  • stack则是将层级最低(默认)的column转化为index
  • unstack默认是将排位最靠后的index转成column(column放到下面)





# pandas.pivot_table生成的结果如下
df_stat_raw
# unstack默认是将排位最靠后的index转成column(column放到下面)
df_stat_raw.unstack() # unstack也可以指定index,然后转成最底层的column
df_stat_raw.unstack('weekday') # 这个语句的效果是一样的,可以指定`index`的位置
# stat_raw.unstack(0)
# stack则是将层级醉倒的column转化为index
df_stat_raw.unstack().stack().head(5)
# 经过两次stack后就成为多维表了
# 每次stack都会像洋葱一样将column放到左侧的index来(放到index序列最后)
df_stat_raw.unstack().stack().stack().head(5)

输出:

weekday  time_mark
1 0 href 4
read_cnt 2386
1 href 32
read_cnt 31888
2 href 94
dtype: int64
pd.DataFrame(df_stat_raw.unstack().stack().stack()).reset_index().head(5)

melt

melt方法中id_vals是指保留哪些作为维度(index),剩下的都看做是数值(value)

除此之外,会另外生成一个维度叫variable,列转行后记录被转的的变量名称

print(df_stat.head(5))

df_stat.melt(id_vars=['weekday']).head(5)
df_stat.melt(id_vars=['weekday','time_mark']).head(5)

Python基础 | pandas中dataframe的整合与形变(merge & reshape)的更多相关文章

  1. Python之Pandas中Series、DataFrame

    Python之Pandas中Series.DataFrame实践 1. pandas的数据结构Series 1.1 Series是一种类似于一维数组的对象,它由一组数据(各种NumPy数据类型)以及一 ...

  2. Python之Pandas中Series、DataFrame实践

    Python之Pandas中Series.DataFrame实践 1. pandas的数据结构Series 1.1 Series是一种类似于一维数组的对象,它由一组数据(各种NumPy数据类型)以及一 ...

  3. Spark与Pandas中DataFrame对比

      Pandas Spark 工作方式 单机single machine tool,没有并行机制parallelism不支持Hadoop,处理大量数据有瓶颈 分布式并行计算框架,内建并行机制paral ...

  4. Spark与Pandas中DataFrame对比(详细)

      Pandas Spark 工作方式 单机single machine tool,没有并行机制parallelism不支持Hadoop,处理大量数据有瓶颈 分布式并行计算框架,内建并行机制paral ...

  5. Pandas中DataFrame修改列名

    Pandas中DataFrame修改列名:使用 rename df = pd.read_csv('I:/Papers/consumer/codeandpaper/TmallData/result01- ...

  6. pandas中DataFrame的ix,loc,iloc索引方式的异同

    pandas中DataFrame的ix,loc,iloc索引方式的异同 1.loc: 按照标签索引,范围包括start和end 2.iloc: 在位置上进行索引,不包括end 3.ix: 先在inde ...

  7. python – 基于pandas中的列中的值从DataFrame中选择行

    如何从基于pandas中某些列的值的DataFrame中选择行?在SQL中我将使用: select * from table where colume_name = some_value. 我试图看看 ...

  8. python数据分析pandas中的DataFrame数据清洗

    pandas中的DataFrame中的空数据处理方法: 方法一:直接删除 1.查看行或列是否有空格(以下的df为DataFrame类型,axis=0,代表列,axis=1代表行,以下的返回值都是行或列 ...

  9. Python基础 — Pandas

    Pandas -- 简介 Python Data Analysis Library 或 pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的.        Pandas ...

随机推荐

  1. Python——详解collections工具库

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天为大家介绍Python当中一个很好用也是很基础的工具库,叫做collections. collection在英文当中有容器的意思,所以顾 ...

  2. python2.7.6安装easy_install (windows 64 环境)

    1.复制以下代码保存到easy_install.py文件中(文件名可随意命名)并将该文件放到python的安装路径中(如:D:\Python27) #!/usr/bin/env python &quo ...

  3. OCR场景文本识别:文字检测+文字识别

    一. 应用背景 OCR(Optical Character Recognition)文字识别技术的应用领域主要包括:证件识别.车牌识别.智慧医疗.pdf文档转换为Word.拍照识别.截图识别.网络图片 ...

  4. idea导入 spring framework项目

    准备的环境:gradle,idea 注意:gradle版本不一致会报各种错误,那么怎么查找依赖的版本呢? 首先在git上把spring framework项目拉取下来, 步骤一:复制URL路径 步骤二 ...

  5. 开发项目是Integer 与int 什么时候用

    什么时候用Integer : 如果该属性所对应的数据库的字段是主键或者是外键时,用Integer:因为Integer的默认值为null,数据库的主键或者外键不能为空,但是可以为null 什么时候用in ...

  6. 前端每日实战:125# 视频演示如何用纯 CSS 创作一个失落的人独自行走的动画

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/MqpOdR/ 可交互视频 此视频是 ...

  7. LeetCode:两数之和、三数之和、四数之和

    LeetCode:两数之和.三数之和.四数之和 多数之和问题,利用哈希集合减少时间复杂度以及多指针收缩窗口的巧妙解法 No.1 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在 ...

  8. 初探Linux

    这是一个小小新手根据自己对Linux的理解而写下的笔记,记录的是大体的学习内容.记录的笔记不全面,甚至没有整体的概念,但也希望能够给部分人一些入门的帮助,实机基于CentOS 7. 导语:学习一件新事 ...

  9. 自定义FrameWork

    本项目是基于iOS-Universal-Framework-master框架制作的,故编译之前需要安装iOS-Universal-Framework-master框架, 步骤如下:1.跳转到iOS-U ...

  10. 【转】Maven详细

    Maven maven 中央仓库 网站 https://mvnrepository.com/ 全世界 发布到Maven仓库 供用类着使用 maven 本质上下载工具和构建工具 下载工具 迅雷 只能下载 ...