Pandas高阶--数据规整(1)--数据合并concat\(2)--数据连接merge\(3)数据重构stack\unstack

 

 

 

 

 

 

 

实验:

第六课 数据分析工具Pandas高阶

第七节 数据规整(1)--数据合并 concat

In [1]:

 

 
import pandas as pd
import numpy as np

In [2]:

 

# 创建dataframe
df1 = pd.DataFrame({'A':['A0', 'A1', 'A2', 'A3'],
                    'B':['B0', 'B1', 'B2', 'B3'],
                    'C':['C0', 'C1', 'C2', 'C3'],
                    'D':['D0', 'D1', 'D2', 'D3']},
                    index=[0, 1, 2, 3])
df2 = pd.DataFrame({'A':['A4', 'A5', 'A6', 'A7'],
                    'B':['B4', 'B5', 'B6', 'B7'],
                    'C':['C4', 'C5', 'C6', 'C7'],
                    'D':['D4', 'D5', 'D6', 'D7']},
                    index=[4, 5, 6, 7])
df3 = pd.DataFrame({'A':['A8', 'A9', 'A10', 'A11'],
                    'B':['B8', 'B9', 'B10', 'B11'],
                    'C':['C8', 'C9', 'C10', 'C11'],
                    'D':['D8', 'D9', 'D10', 'D11']},
                    index=[0, 1, 2, 3])

In [3]:

 

 
df1

Out[3]:

 ABCD
0A0B0C0D0
1A1B1C1D1
2A2B2C2D2
3A3B3C3D3

In [4]:

 

 
df2

Out[4]:

 ABCD
4A4B4C4D4
5A5B5C5D5
6A6B6C6D6
7A7B7C7D7

In [5]:

 

 
df3

Out[5]:

 ABCD
0A8B8C8D8
1A9B9C9D9
2A10B10C10D10
3A11B11C11D11

纵向合并

In [6]:

 

 
#列名相同
pd.concat([df1,df2],axis=0)

Out[6]:

 ABCD
0A0B0C0D0
1A1B1C1D1
2A2B2C2D2
3A3B3C3D3
4A4B4C4D4
5A5B5C5D5
6A6B6C6D6
7A7B7C7D7

In [7]:

 

 
# 列名不同
pd.concat([df1,df3],axis=0)

Out[7]:

 ABCD
0A0B0C0D0
1A1B1C1D1
2A2B2C2D2
3A3B3C3D3
0A8B8C8D8
1A9B9C9D9
2A10B10C10D10
3A11B11C11D11

横向合并

In [8]:

 

 
# index相同
pd.concat([df1,df3],axis=1)

Out[8]:

 ABCDABCD
0A0B0C0D0A8B8C8D8
1A1B1C1D1A9B9C9D9
2A2B2C2D2A10B10C10D10
3A3B3C3D3A11B11C11D11

In [9]:

 

 
# index 不同
pd.concat([df1,df2],axis=1)

Out[9]:

 ABCDABCD
0A0B0C0D0NaNNaNNaNNaN
1A1B1C1D1NaNNaNNaNNaN
2A2B2C2D2NaNNaNNaNNaN
3A3B3C3D3NaNNaNNaNNaN
4NaNNaNNaNNaNA4B4C4D4
5NaNNaNNaNNaNA5B5C5D5
6NaNNaNNaNNaNA6B6C6D6
7NaNNaNNaNNaNA7B7C7D7

(2)--数据连接 merge

In [10]:

 

 
import pandas as pd
import numpy as np

In [13]:

 

# 创建dataframe
staff_df = pd.DataFrame([{'姓名':'张三','部门':'研发部'},
                        {'姓名':'李四','部门':'财务部'},
                        {'姓名':'赵六','部门':'市场部'}])
student_df = pd.DataFrame([{'姓名':'张三','部门':'计算机'},
                        {'姓名':'李四','部门':'会计'},
                        {'姓名':'王五','部门':'市场营销'}])

In [14]:

 

 
staff_df

Out[14]:

 姓名部门
0张三研发部
1李四财务部
2赵六市场部

In [15]:

 

 
student_df

Out[15]:

 姓名部门
0张三计算机
1李四会计
2王五市场营销

 

 
连接操作

In [16]:

 

 
# 外连接
pd.merge(staff_df,student_df,how='outer',on='姓名')
#或者
#staf_df.merge(student_df,how='outer', on='姓名')

Out[16]:

 姓名部门_x部门_y
0张三研发部计算机
1李四财务部会计
2赵六市场部NaN
3王五NaN市场营销

In [17]:

 

 
# 内连接
pd.merge(staff_df,student_df,how='inner',on='姓名')
#或者
#staf_df.merge(student_df,how='ineer', on='姓名')

Out[17]:

 姓名部门_x部门_y
0张三研发部计算机
1李四财务部会计

In [18]:

 

 
# 左连接
pd.merge(staff_df,student_df,how='left',on='姓名')
#或者
#staf_df.merge(student_df,how='left', on='姓名')

Out[18]:

 姓名部门_x部门_y
0张三研发部计算机
1李四财务部会计
2赵六市场部NaN

In [19]:

 

 
# 右连接
pd.merge(staff_df,student_df,how='right',on='姓名')
#或者
#staf_df.merge(student_df,how='right', on='姓名')

Out[19]:

 姓名部门_x部门_y
0张三研发部计算机
1李四财务部会计
2王五NaN市场营销

In [21]:

 

 
#添加新的数据列
staff_df['地址'] = ['天津','北京','上海']
student_df['地址'] = ['天津','上海','广州']

In [22]:

 

 
staff_df

Out[22]:

 姓名部门地址
0张三研发部天津
1李四财务部北京
2赵六市场部上海

In [23]:

 

 
student_df

Out[23]:

 姓名部门地址
0张三计算机天津
1李四会计上海
2王五市场营销广州

In [24]:

 

 
#处理重复列名
# 如果两个数据中包含有相同的列名(不是要合并的列)时,merge会自动加后缀作为区别
pd.merge(staff_df,student_df,how='left',left_on='姓名',right_on='姓名')

Out[24]:

 姓名部门_x地址_x部门_y地址_y
0张三研发部天津计算机天津
1李四财务部北京会计上海
2赵六市场部上海NaNNaN

按索引连接

In [26]:

 

 
# 设置“姓名”为索引
staff_df.set_index('姓名',inplace=True)
student_df.set_index('姓名',inplace=True)

In [27]:

 

 
staff_df

Out[27]:

 部门地址
姓名  
张三研发部天津
李四财务部北京
赵六市场部上海

In [28]:

 

 
student_df

Out[28]:

 部门地址
姓名  
张三计算机天津
李四会计上海
王五市场营销广州

In [29]:

 

 
pd.merge(staff_df,student_df,how='left',left_index=True,right_index=True)
# 或者
# staff_df.merge(student_df,how='left',left_index=True,right_index=True)

Out[29]:

 部门_x地址_x部门_y地址_y
姓名    
张三研发部天津计算机天津
李四财务部北京会计上海
赵六市场部上海NaNNaN

数据重构stack、unstack

In [30]:

 

 
import pandas as pd

In [31]:

 

 
# 创建dataframe
header = pd.MultiIndex.from_product([['Semester1','Semester2'],['Math','Science']])
d = [[12,45,67,56],[78,89,45,67],[45,67,89,90],[67,44,56,55]]
df = pd.DataFrame(d,index=['Alisa','Bobby','Cathrine','Jack'],columns=header)
df

Out[31]:

 Semester1Semester2
 MathScienceMathScience
Alisa12456756
Bobby78894567
Cathrine45678990
Jack67445655

In [33]:

 

stacked_df = df.stack()
stacked_df

Out[33]:

  Semester1Semester2
AlisaMath1267
Science4556
BobbyMath7845
Science8967
CathrineMath4589
Science6790
JackMath6756
Science4455

In [34]:

 

 
# level 参数
df.stack(level=0)

Out[34]:

  MathScience
AlisaSemester11245
Semester26756
BobbySemester17889
Semester24567
CathrineSemester14567
Semester28990
JackSemester16744
Semester25655

In [35]:

 

 
df.stack(level=1)

Out[35]:

  Semester1Semester2
AlisaMath1267
Science4556
BobbyMath7845
Science8967
CathrineMath4589
Science6790
JackMath6756
Science4455

In [36]:

 

 
df.stack(level=-1)

Out[36]:

  Semester1Semester2
AlisaMath1267
Science4556
BobbyMath7845
Science8967
CathrineMath4589
Science6790
JackMath6756
Science4455

In [37]:

 

 
stacked_df

Out[37]:

  Semester1Semester2
AlisaMath1267
Science4556
BobbyMath7845
Science8967
CathrineMath4589
Science6790
JackMath6756
Science4455

In [38]:

 

 
stacked_df.unstack()

Out[38]:

 Semester1Semester2
 MathScienceMathScience
Alisa12456756
Bobby78894567
Cathrine45678990
Jack67445655

In [40]:

 

 
stacked_df.unstack(level=0)

Out[40]:

 Semester1Semester2
 AlisaBobbyCathrineJackAlisaBobbyCathrineJack
Math1278456767458956
Science4589674456679055

In [41]:

 

 
stacked_df.unstack(level=1)

Out[41]:

 Semester1Semester2
 MathScienceMathScience
Alisa12456756
Bobby78894567
Cathrine45678990
Jack67445655

In [42]:

 

 
stacked_df.unstack(level=-1)

Out[42]:

 Semester1Semester2
 MathScienceMathScience
Alisa12456756
Bobby78894567
Cathrine45678990
Jack67445655

In [ ]:

 

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值