[toc]

本文示例数据下载,密码: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

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)

行列转置

# 数据准备

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

href 4

read_cnt 2386

href 32

read_cnt 31888

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)

关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。

本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。

[Python基础 | pandas中dataframe的整合与形变(merge & reshape)]http://www.zyiz.net/tech/detail-124345.html

python column stack_Python基础 | pandas中dataframe的整合与形变(merge reshape)相关推荐

  1. Python—pandas中DataFrame类型数据操作函数

    python数据分析工具pandas中DataFrame和Series作为主要的数据结构.  本文主要是介绍如何对DataFrame数据进行操作并结合一个实例测试操作函数.  1)查看DataFram ...

  2. Python将Pandas中Dataframe数据保存为gzip/zip文件:gzip压缩文件、zip压缩文件

    Python将Pandas中Dataframe数据保存为gzip/zip文件:gzip压缩文件.zip压缩文件 目录 Python将Pandas中Dataframe数据保存为gzip/zip文件:gz ...

  3. Python之pandas:对pandas中dataframe数据中的索引输出、修改、重命名等详细攻略

    Python之pandas:对pandas中dataframe数据中的索引输出.修改.重命名等详细攻略 目录 对pandas中dataframe数据中的索引输出.修改.重命名等详细攻略 知识点学习 输 ...

  4. python查看dataframe数据类型_python pandas中DataFrame类型数据操作函数的方法

    python数据分析工具pandas中DataFrame和Series作为主要的数据结构. 本文主要是介绍如何对DataFrame数据进行操作并结合一个实例测试操作函数. 1)查看DataFrame数 ...

  5. python科学计算笔记(九)pandas中DataFrame数据操作函数

    Python数据分析工具pandas中DataFrame和Series作为主要的数据结构. 本文主要是介绍如何对DataFrame数据进行操作并结合一个实例测试操作函数. 1)查看DataFrame数 ...

  6. python dataframe函数_python pandas中DataFrame类型数据操作函数的方法

    这篇文章主要介绍了关于python pandas中DataFrame类型数据操作函数的方法,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 python数据分析工具pandas中Data ...

  7. Pandas中DataFrame基本函数整理(全)

    [python]Pandas中DataFrame基本函数整理(全) 构造函数 DataFrame([data, index, columns, dtype, copy]) #构造数据框 属性和数据 D ...

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

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

  9. pandas中dataframe默认不显示所有的数据行(中间省略)、使用option_context函数自定义设置单个dataframe允许显示的行的个数、set_option函数全局设置显示行的个数

    pandas中dataframe默认不显示所有的数据行(中间省略).使用option_context函数自定义设置单个dataframe允许显示的行的个数.set_option函数全局设置显示行的个数 ...

最新文章

  1. python读取excel表格-python读写excel文件
  2. Java嵌套构造函数造成的stack overflow异常
  3. Spring(1)-IOC
  4. 机器学习顶刊文献_“大数据+机器学习”在光催化制氢中的研究范式
  5. sql多表查询的总结
  6. 第1章 Spark SQL概述
  7. 读书笔记:《把时间当作朋友》
  8. Mac SnailSVN不显示状态图标
  9. org.apache.jasper.JasperException: /app/jsonp.jsp(1,2) Page-encoding specified in jsp-property-grou
  10. 西方文学名著鉴赏——英文诗歌翻译赏析
  11. iphone6s读写速度测试软件,iPhone6S/7/8运行iOS13速度测试:结果有点失望
  12. 教育教培行业年终工作总结ppt制作幻灯片模板设计.pptx
  13. 目前梦幻山东区人最多的服务器,梦幻西游十大火区盘点:有好朋友的区就是最火的区...
  14. 1000句英语经典口语(10)
  15. idea配置查看代码汇编指令插件
  16. CRM系统的两个核心
  17. Ant Design Vue 文件上传自定义按钮和文件列表位置
  18. 转账到支付宝账户(企业支付宝)
  19. vue2 Object.definProperty响应式原理(面试题)
  20. Keras搭建CNN(手写数字识别Mnist)

热门文章

  1. excel如何把顺序倒过来_Excel 中的计算运算符和优先顺序级别
  2. scala list 接受java string_「软帝学院」Java零基础学习详解
  3. c语言程序设计2014春第一套作业,C语言程序设计2014春第一套作业
  4. 1126: 第二章:我们都有梦想
  5. oracle锁表语句执行提示无法终止当前对话_Oracle 强制中止正在执行的SQL语句
  6. 阿里云IoT何云飞:智物Cloud AIoT Native 为何能让设备智能更快一步
  7. Flink 1.12 资源管理新特性
  8. 提升你的职场竞争力——“低代码开发师”来了!
  9. 4月24日Serverless Developer Meetup上海亮相
  10. 阿里云数据库2020技术年报新鲜出炉,全力开启牛年新征程!