Python数据分析pandas之数据拼接与连接
Python数据分析pandas之数据拼接与连接
数据拼接处理
数据拼接处理指的是numpy、pandas里对数据的拼接、连接、合并等多种方法的概称。有时我们处理的数据会分很多步骤,而中间或者最终的结果可能是由多个数据框、多维数组通过拼接等方式组装而来。本章节主要介绍如何使用拼接、连接、合并的方法处理numpy和pandas类型的数据。
数据拼接
数据拼接主要是对行(列)名相同的元素进行拼接,行拼接则会使行变多,而列不变,而列拼接则是列变多,而行固定。
Numpy数组axis=0行拼接
# 1 通过np的concatenate方法对数组进行拼接,拼接时不会改变数组的维数。
x=[9,8,7]
y=[6,5,4]
z=[3,2,1]
data=np.concatenate([x,y,z],axis=0)
print(data)#如果我们指定axis=1,则会报错,错误信息见下:
numpy.AxisError: axis 1 is out of bounds for array of dimension 1# 2 拼接时如果指定的axis=0,则是行拼接,即行变多,而列保持不变;而axis=1,则是列拼接,即列变多,而行保持不变。这里不变是相对第一个数组。
arr1=np.array([[1,2,3],[4,5,3],[11,12,13]])
arr2=np.array([[6,7,8],[21,22,23]])
#这里行可以少于第一个数组,但列要相同。
print(np.concatenate([arr1,arr2],axis=0))
#结果
[[ 1 2 3]
[ 4 5 3]
[11 12 13]
[ 6 7 8]
[21 22 23]]
Numpy数组axis=1列拼接
# 1 按照行方向拼接,列增宽。
arr1=np.array([[1,2,3],[4,5,3],[11,12,13]])
arr2=np.array([[6,7,8],[21,22,23],[34,78,67]])
#行和列都要跟第一个数组一致。 print(np.concatenate([arr1,arr2],axis=1))
#结果
[[ 1 2 3 6 7 8]
[ 4 5 3 21 22 23]
[11 12 13 34 78 67]]
Pandas axis=0行拼接
Pandas的拼接和numpy类似。
# axis=0 行拼接,即列保持不变,行变多。
import pandas as pd
df1=pd.DataFrame([["张三",28],["李四",32],["王二",19]],columns=[ 'name','age',],index=['no_001','no_002','no_003']) df2=pd.DataFrame([["刘二",48],["宋五",32]],columns=[ 'name','age',],index=['no_004','no_005'])
print(pd.concat([df1,df2],axis=0))
#结果name age
no_001 张三 28
no_002 李四 32
no_003 王二 19
no_004 刘二 48
no_005 宋五 32
Pandas axis=1列拼接
# axis=1列拼接,即行保持不变,列变多。在原有的姓名、年龄后追加等级列。
import pandas as pd
df1=pd.DataFrame([["张三",28],["李四",32],["王二",19]],columns=[ 'name','age',],index=['no_001','no_002','no_003'])
df2=pd.DataFrame([['A'],['B'],['C']],columns=['level'],index=['no_001','no_002','no_003'])
print(pd.concat([df1,df2],axis=1))
#结果name age level
no_001 张三 28 A
no_002 李四 32 B
no_003 王二 19 C
Pandas重复索引拼接
# 特别的,如果拼接时索引出现重复,pandas会同时显示两个一样的索引。
import pandas as pd
df1=pd.DataFrame([["张三",28],["李四",32],["王二",19]],columns=[ 'name','age',],index=['no_001','no_002','no_003'])
df2=pd.DataFrame([["刘二",48],["宋五",32]],columns=[ 'name','age',],index=['no_001','no_002'])
print(pd.concat([df1,df2],axis=0))
print(pd.concat([df1,df2],axis=0,ignore_index=True))
#结果name age
no_001 张三 28
no_002 李四 32
no_003 王二 19
no_001 刘二 48
no_002 宋五 32
Pandas忽略索引拼接
# 索引重复时通过ignore_index=True参数忽略索引
import pandas as pd
df1=pd.DataFrame([["张三",28],["李四",32],["王二",19]],columns=[ 'name','age',],index=['no_001','no_002','no_003'])
df2=pd.DataFrame([["刘二",48],["宋五",32]],columns=[ 'name','age',],index=['no_001','no_002'])
print(pd.concat([df1,df2],axis=0,ignore_index=True))name age
0 张三 28
1 李四 32
2 王二 19
3 刘二 48
4 宋五 32
Pandas 多层维索引拼接
import pandas as pd
df1=pd.DataFrame([["张三",28],["李四",32],["王二",19]],columns=[ 'name','age',],index=['no_001','no_002','no_003'])
df2=pd.DataFrame([["刘二",48],["宋五",32]],columns=[ 'name','age',],index=['no_001','no_002'])
print(pd.concat([df1,df2],axis=0,keys=['one','two']))
#结果name age
one no_001 张三 28no_002 李四 32no_003 王二 19
two no_001 刘二 48no_002 宋五 32
Pandas 内连接方式拼接
#内连接方式(inner join)是对有相同的列做拼接,拼接时只通过相同的列名匹配。
import pandas as pd
df1=pd.DataFrame([["张三",28],["李四",32],["王二",19]],columns=[ 'name','age',],index=['no_001','no_002','no_003'])
df2=pd.DataFrame([["李四",32,'A'],["宋五",32,'B']],columns=[ 'name','age','level'],index=['no_001','no_002'])
print(pd.concat([df1,df2],axis=0,join="inner"))
#结果name age
no_001 张三 28
no_002 李四 32
no_003 王二 19
no_001 李四 32
no_002 宋五 32
Pandas 外连接方式拼接
#外连接方式(outer join)是所有的列都参与拼接,期中列名不在主表的用NaN填充。import pandas as pd
df1=pd.DataFrame([["张三",28],["李四",32],["王二",19]],columns=[ 'name','age',],index=['no_001','no_002','no_003'])
df2=pd.DataFrame([["李四",32,'A'],["宋五",32,'B']],columns=[ 'name','age','level'],index=['no_001','no_002'])
#这里因为有重复数据,所以加了个sort=True
print(pd.concat([df1,df2],axis=0,join="outer",sort=True))
#结果age level name
no_001 28 NaN 张三
no_002 32 NaN 李四
no_003 19 NaN 王二
no_001 32 A 李四
no_002 32 B 宋五
Pandas join_axes连接方式拼接
#通过join_axes参数指定输出时的列名和顺序
import pandas as pd
df1=pd.DataFrame([["张三",28],["李四",32],["王二",19]],columns=[ 'name','age',],index=['no_001','no_002','no_003'])
df2=pd.DataFrame([["李四",32,'A'],["宋五",32,'B']],columns=[ 'name','age','level'],index=['no_001','no_002'])
print(pd.concat([df1,df2],axis=0,join_axes=[df2.columns]))
#结果name age level
no_001 张三 28 NaN
no_002 李四 32 NaN
no_003 王二 19 NaN
no_001 李四 32 A
no_002 宋五 32 B
Pandas 追加方式拼接
# 通过append(追加)方式拼接,该方法是应用拼接的数据生成个新的对象而不是修改原有Pandas的数据。
import pandas as pd
df1=pd.DataFrame([["张三",28],["李四",32],["王二",19]],columns=['name','age',],index=['no_001','no_002','no_003'])
df2=pd.DataFrame([["李四",32],["宋五",32]],columns=['name','age'],index=['no_001','no_002'])
print(df1.append(df2))
#结果name age
no_001 张三 28
no_002 李四 32
no_003 王二 19
no_001 李四 32
no_002 宋五 32
数据连接
数据连接主要是对行(列)名相同的元素进行关联,用两者列名相同的元素进行内容匹配。
Merge 内连接
Merge inner(内连接)方式时会按照两个DataFrame有相同的列名和值去匹配,有记录即返回。返回的列名不会出现重复。
import pandas as pd
df1=pd.DataFrame([["张三",28],["李四",32],["王二",19]],columns=['name','age',],index=['no_001','no_002','no_003'])
df2=pd.DataFrame([["李四",32,'A'],["王二",19,'B'],["王三",34,'C']],columns=['name','age','level'],index=['no_004','no_005','no_006'])
print(pd.merge(df1,df2,how='inner'))
#print(pd.merge(df1,df2)) #等价于上式
#print(df1.merge(df2)) #等价于上式
#结果name age level
0 李四 32 A
1 王二 19 B
Merge 外连接
Merge outer(外连接)方式是会按照两个DataFrame有相同的列名和值去匹配,匹配不上的用NaN填充。返回的列名不会出现重复。
import pandas as pd
df1=pd.DataFrame([["张三",28],["李四",32],["王二",19]],columns=['name','age',],index=['no_001','no_002','no_003'])
df2=pd.DataFrame([["李四",32,'A'],["王二",19,'B'],["王三",34,'C']],columns=['name','age','level'],index=['no_004','no_005','no_006'])
print(pd.merge(df1,df2,how='outer'))
#print(df1.merge(df2,how='outer')) #等价于上式
#结果name age level
0 张三 28 NaN
1 李四 32 A
2 王二 19 B
3 王三 34 C
Merge 左外连接
Merge left(左连接)方式是按照两个DataFrame有相同的列名和值去匹配,其中左边的为主表(返回记录同左表),匹配不上的用NaN填充。返回的列名不会出现重复。
同理right(右连接)与左连接类似。
import pandas as pd
df1=pd.DataFrame([["张三",28],["李四",32],["王二",19]],columns=['name','age',],index=['no_001','no_002','no_003'])
df2=pd.DataFrame([["李四",32,'A'],["王二",19,'B'],["王三",34,'C']],columns=['name','age','level'],index=['no_004','no_005','no_006'])
print(pd.merge(df1,df2,how='left'))
# print(df1.merge(df2,how='left')) 等价于上式
print(pd.merge(df1,df2,how='right'))#结果name age level
0 张三 28 NaN
1 李四 32 Aname age level
0 李四 32 A
1 王二 19 B
2 王三 34 C
Merge 指定key连接
如果要连接的字段名称不一样,那么就需要用指定key的方式去连接。
import pandas as pd
df1=pd.DataFrame([["张三",28],["李四",32],["王二",19]],columns=['name','age',],index=['no_001','no_002','no_003'])
df2=pd.DataFrame([["李四",32,'A'],["王二",19,'B'],["王三",34,'C']],columns=['title','year','level'],index=['no_004','no_005','no_006'])
print(pd.merge(df1,df2,left_on=["name","age"],right_on=["title","year"]))
#结果name age title year level
0 李四 32 李四 32 A
1 王二 19 王二 19 B
Merge 指定key删除重复列连接
该方式在指定key连接的基础上会删除重复的列,即取连接里去重后的列名。
import pandas as pd
df1=pd.DataFrame([["张三",28],["李四",32],["王二",19]],columns=['name','age',],index=['no_001','no_002','no_003'])
df2=pd.DataFrame([["李四",32,'A'],["王二",19,'B'],["王三",34,'C']],columns=['title','year','level'],index=['no_004','no_005','no_006'])
print(pd.merge(df1,df2,left_on=["name","age"],right_on=["title","year"]).drop(["title","year"],axis=1))
#结果name age level
0 李四 32 A
1 王二 19 B
Merge 指定索引连接
该方式是通过索引进行数据的连接,参数为left_index。如果想删除“重复”的列,接drop函数即可。见下例:
import pandas as pd
df1=pd.DataFrame([["张三",28],["李四",32],["王二",19]],columns=['name','age',],index=['no_001','no_002','no_003'])
df2=pd.DataFrame([["李四",32,'A'],["王二",19,'B'],["王三",34,'C']],columns=['title','year','level'],index=['no_004','no_002','no_003'])
print(pd.merge(df1,df2,left_index=True,right_index=True))
#指定要删除的列
print(pd.merge(df1,df2,left_index=True,right_index=True).drop(["title","year"],axis=1))
#结果name age title year level
no_002 李四 32 王二 19 B
no_003 王二 19 王三 34 Cname age level
no_002 李四 32 B
no_003 王二 19 C注:1 left_index(right_index)可以和right_on(left_on)混(一起)用。
Join实现数据连接
Pandas实现了join方法来进行数据的连接,不过需要注意的是,这里默认是按照索引连连接。
import pandas as pd
df1=pd.DataFrame([["张三",28],["李四",32],["王二",19],["王一",23]],columns=['name','age',],index=['no_001','no_002','no_003','no_004'])
df2=pd.DataFrame([["李四",32,'A'],["王二",19,'B'],["王三",34,'C'],["刘七",35,'A']],columns=['name','age','level'],index=['no_001','no_002','no_003','no_006'])
print(df1.join(df2,how="outer",rsuffix='_r'))
print(df1.join(df2,how="left",rsuffix='_r'))
print(df1.join(df2,how="inner",lsuffix='_l'))
print(df1.join(df2,how="inner",rsuffix='_r').drop(["name_r","age_r"],axis=1))#结果name age name_r age_r level
no_001 张三 28.0 李四 32.0 A
no_002 李四 32.0 王二 19.0 B
no_003 王二 19.0 王三 34.0 C
no_004 王一 23.0 NaN NaN NaN
no_006 NaN NaN 刘七 35.0 Aname age name_r age_r level
no_001 张三 28 李四 32.0 A
no_002 李四 32 王二 19.0 B
no_003 王二 19 王三 34.0 C
no_004 王一 23 NaN NaN NaNname_l age_l name age level
no_001 张三 28 李四 32 A
no_002 李四 32 王二 19 B
no_003 王二 19 王三 34 Cname age level
no_001 张三 28 A
no_002 李四 32 B
no_003 王二 19 C
Python数据分析pandas之数据拼接与连接相关推荐
- Python数据分析——Pandas基础:dt.datetime与pivot_table()数据透视表
系列文章目录 Chapter 1:创建与探索DF.排序.子集化:Python数据分析--Pandas基础入门+代码(一) Chapter 2:聚合函数,groupby,统计分析:Python数据分析- ...
- Python数据分析pandas之dataframe初识
Python数据分析pandas之dataframe初识 声明与简介 pandas是一个基于python的.快速的.高效.灵活.易用的开源的数据处理.分析包(工具)..pandas构建在numpy之上 ...
- Python数据分析pandas之分组统计透视表
Python数据分析pandas之分组统计透视表 数据聚合统计 Padans里的聚合统计即是应用分组的方法对数据框进行聚合统计,常见的有min(最小).max(最大).avg(平均值).sum(求和) ...
- Python数据分析pandas之series初识
Python数据分析pandas之series初识 声明与简介 pandas是一个基于python的.快速的.高效.灵活.易用的开源的数据处理.分析包(工具)..pandas构建在numpy之上,它通 ...
- python中pandas的数据输出显示设置
python中pandas的数据输出显示设置1 pandas数据分析时经常需要打印输出数据,当数据量大时,输出的展示设置非常重要,好的展示可以帮助更好地理解数据. pandas相关的显示设置函数主要有 ...
- Python数据分析pandas之多层高维索引
Python数据分析pandas之多层高维索引 DataFrame多层索引 多层索引简介 众所周知Pandas的Series和DataFrame存放的是一维和二维数组,那么想存放多维数组就得通过多层索 ...
- Python数据分析中的数据预处理:数据标准化
[小白从小学Python.C.Java] [Python全国计算机等级考试] [Python数据分析考试必会题] ● 标题与摘要 Python数据分析中的 数据预处理:数据标准化 ● 选择题 以下关于 ...
- Python使用pandas设置数据列中float数据类型的有效小数位数、抑制科学计数法
Python使用pandas设置数据列中float数据类型的有效小数位数.抑制科学计数法 目录
- Python打乱pandas的数据
Python打乱pandas的数据 最简单的方法就是采用pandas中自带的 sample这个方法. sample 函数本来是用来采样数据的,默认是打乱数据再采样,所以可以使用他来打乱数据. 样例: ...
最新文章
- linux开机自动启动
- Java数组(1)--数组概述
- python 反射机制
- Tomcat的下载安装及使用
- yum install mysql-server 指定版本_mysql 指定版本安装
- c语言烟花表白程序代码,C语言实战之浪漫烟花表白程序代码
- MATLAB导出矢量图
- 个人简历表格 个人简历word百度云 完整个人简历样本
- 战舰世界显示无法连接服务器失败,王美雪:战舰世界无法连接服务器解决方法 无法登陆怎么办...
- 数据优化——分库分表(三)中间件讲解
- 二、ArcGIS中shp裁剪dem
- NET Reflector 7.6.1.824安装及破解
- 通信中的MGF(矩生成函数)
- 教您如何查看Win7详细系统版本号
- 如何读取远程4G网络摄像头的视频流?
- ch01变量和数据结构
- 苹果iphone 12它只是一个电话
- 采用deepdive的上市公司关系抽取
- AI路径查找器的使用
- 二进制与8,10,16转换
热门文章
- OpenCASCADE:OCCT应用框架OCAF之标准文件服务
- boost::mpl模块实现lambda相关的测试程序
- boost::hana::nothing用法的测试程序
- boost::hana::alignof_用法的测试程序
- boost::high_bit_mask_t和boost::low_bits_mask_t用法的测试程序
- boost::posix_time模块实现计算时间段的测试程序
- DCMTK:测试dcmiod的颜色转换功能
- VTK:绘图之PieChartActor
- C语言实现djikstra算法(附完整源码)
- ++i 和 i++的实现