pandas的数据拼接与合并(concat、join、merge)

代码示例:

import pandas as pd 
import numpy as np
from pandas import Series,DataFrame


#数据的拼接:concat
'''
axis=0 , join='inner' : 行上面进行伸缩,列的上面取交集
axis=0 , join='outer' : 行上面进行伸缩,列的上面取并集  等价于 df1.append(df2)
axis=1 , join='inner' : 列上面进行伸缩,行的上面取交集
axis=1 , join='outer' : 列上面进行伸缩,行的上面取并集

ignore_index: 指的是拼接后是否忽视原df各自的索引
'''
df1 = pd.DataFrame(np.arange(6).reshape(3,2),columns=['a','c'])
df2 = pd.DataFrame(np.arange(6).reshape(2,3),columns=['c','d','e'])
print(pd.concat([df1,df2]))
'''
打印:
     a  c    d    e
0  0.0  1  NaN  NaN
1  2.0  3  NaN  NaN
2  4.0  5  NaN  NaN
0  NaN  0  1.0  2.0
1  NaN  3  4.0  5.0
'''
print(pd.concat([df1,df2],axis=0,join='outer'))
'''
打印:
     a  c    d    e
0  0.0  1  NaN  NaN
1  2.0  3  NaN  NaN
2  4.0  5  NaN  NaN
0  NaN  0  1.0  2.0
1  NaN  3  4.0  5.0
'''
print(pd.concat([df1,df2],axis=1,join='inner'))
'''
打印:
   a  c  c  d  e
0  0  1  0  1  2
1  2  3  3  4  5
'''
print(pd.concat([df1,df2],axis=0,join='outer',ignore_index=True))
'''
打印:
     a  c    d    e
0  0.0  1  NaN  NaN
1  2.0  3  NaN  NaN
2  4.0  5  NaN  NaN
3  NaN  0  1.0  2.0
4  NaN  3  4.0  5.0
'''


#数据的合并:join。结果默认是以左表为基础显示,how='left' ,'right' ,'inner','outer' 
df3=pd.DataFrame({'亮度':[1,3,5],'色度':[5,0,3]},index=list('abc'))
df4=pd.DataFrame({'饱和度':[1,9,8],'对比度':[6,6,7]},index=list('cde'))
print(df3.join(df4,how='outer'))
'''
打印:
   亮度   色度  饱和度  对比度
a  1.0  5.0  NaN  NaN
b  3.0  0.0  NaN  NaN
c  5.0  3.0  1.0  6.0
d  NaN  NaN  9.0  6.0
e  NaN  NaN  8.0  7.0
'''
print(df3.join(df4,how='left'))
'''
打印:
   亮度  色度  饱和度  对比度
a   1   5  NaN  NaN
b   3   0  NaN  NaN
c   5   3  1.0  6.0
'''
print(df3.join(df4,how='inner'))
'''
   亮度  色度  饱和度  对比度
c   5   3    1    6
'''


#数据的合并:merge
'''
类似sql中的连接查询,on是连接字段,how='left' ,'right' ,'inner','outer' ,suffixes为两个DataFrame相同字段重命名规则。
on也可以指定多个字段,指定多个字段时,只有多个字段全部一样的条目才会组合到一起
on也可以区分left_on和right_on,比如pd.merge(df5,df6,left_on='名字',right_on='姓名'),应对合并DataFrame字段名字不一样的情况
'''
print('*'*30)
df5=pd.DataFrame({'名字':list('abcde'),'性别':['男','女','男','男','女'],'职称':['副教授','讲师','助教','教授','助教']},index=range(1001,1006))
print(df5)
'''
打印:
     名字 性别   职称
1001  a  男  副教授
1002  b  女   讲师
1003  c  男   助教
1004  d  男   教授
1005  e  女   助教
'''
df6=pd.DataFrame({'名字':list('abdax'),'课程':['C++','计算机导论','汇编','数据结构','马克思原理'],'职称':['副教授','讲师','教授','副教授','讲师']},index=[1001,1002,1004,1001,6001])
print('*'*30)
print(df6)
'''
打印:
     姓名     课程   职称
1001  a    C++  副教授
1002  b  计算机导论   讲师
1004  d     汇编   教授
1001  a   数据结构  副教授
6001  x  马克思原理   讲师
'''
print(pd.merge(df5,df6,on=['名字'],how='inner' ,suffixes=['_df1','_df2']))
'''
打印:
  名字 性别 职称_df1     课程 职称_df2
0  a  男    副教授    C++    副教授
1  a  男    副教授   数据结构    副教授
2  b  女     讲师  计算机导论     讲师
3  d  男     教授     汇编     教授
'''
print(pd.merge(df5,df6,on=['名字'],how='outer' ,suffixes=['_df1','_df2']))
'''
打印:
  名字   性别 职称_df1     课程 职称_df2
0  a    男    副教授    C++    副教授
1  a    男    副教授   数据结构    副教授
2  b    女     讲师  计算机导论     讲师
3  c    男     助教    NaN    NaN
4  d    男     教授     汇编     教授
5  e    女     助教    NaN    NaN
6  x  NaN    NaN  马克思原理     讲师
'''
print(pd.merge(df5,df6,on=['名字','职称'],how='left'))
'''
  名字 性别   职称     课程
0  a  男  副教授    C++
1  a  男  副教授   数据结构
2  b  女   讲师  计算机导论
3  c  男   助教    NaN
4  d  男   教授     汇编
5  e  女   助教    NaN
'''

猜你喜欢

转载自blog.csdn.net/caoxinjian423/article/details/113053079