Pandas数据连接

concat

s1=pd.Series([0,1],index=['a','b'])
s2=pd.Series([2,3,4],index=['c','d','e'])
s3=pd.Series([5,6],index=['f','g'])
In[4]: pd.concat([s1,s2,s3])#Series行合并
Out[4]: 
a    0
b    1
c    2
d    3
e    4
f    5
g    6
dtype: int64

说明:直接contact之后,index只是重复,而不是变成我们希望的那样,这样在后续的操作中,容易出现逻辑错误。

使用result = result.reset_index(drop=True)来改变index就可以了

s4=pd.Series([0,5,5,6],index=['a','b','f','g'])
In[6]: pd.concat([s1,s4],axis=1,join='inner')#并集
Out[6]: 
   0  1
a  0  0
b  1  5
In[7]: pd.concat([s1,s4],axis=1,join_axes=[['a','c','b','e']])#指定索引
Out[7]: 
     0    1
a  0.0  0.0
c  NaN  NaN
b  1.0  5.0
e  NaN  NaN
    In[12]: pd.concat({'level1':df1,'level2':df2},axis=1)#字典键做列外索引
    Out[12]: 
      level1     level2     
         one two  three four
    a      0   1    5.0  6.0
    b      2   3    NaN  NaN
    c      4   5    7.0  8.0

pd.merge()

import pandas as pd

left = pd.DataFrame({'姓名':['q','w','e'],'年龄':['18','19','20']})

right = pd.DataFrame({'姓名':['q','w','r'],'籍贯':['湖北','北京','上海']})

left

    姓名     年龄
0     q     18
1     w     19
2     e     20

right

    姓名     籍贯
0     q     湖北
1     w     北京
2     r     上海

# 使用pd.merge()方式进行融合,在默认情况下将重叠列当做键,也可通过参数on指定键

pd.merge(left,right,on='姓名')

    姓名     年龄     籍贯
0     q     18     湖北
1     w     19     北京

# how默认为交集inner,可以指定为并集outer

pd.merge(left,right,on='姓名',how='outer')

    姓名     年龄     籍贯
0     q     18     湖北
1     w     19     北京
2     e     20     NaN
3     r     NaN     上海

pd.merge(left,right,on='姓名',how='left')

    姓名     年龄     籍贯
0     q     18     湖北
1     w     19     北京
2     e     20     NaN

pd.merge(left,right,on='姓名',how='right')

    姓名     年龄     籍贯
0     q     18     湖北
1     w     19     北京
2     r     NaN     上海

# 设定indicator参数为True ,则融合结果中将增加列名为"_merge"的一列,其取值代表了不同的含义: 

pd.merge(left,right,on='姓名',how='outer',indicator=True)

    姓名     年龄     籍贯     _merge
0     q     18     湖北     both
1     w     19     北京     both
2     e     20     NaN     left_only
3     r     NaN     上海     right_only
pd.merge(left,right,on='姓名',how='outer',indicator=True)

    姓名     年龄     籍贯     _merge
0     q     18     湖北     both
1     w     19     北京     both
2     e     20     NaN     left_only
3     r     NaN     上海     right_only

# indicator参数可以接收一个字符串,生成的指标列的列名将由" _merge"变为该字符串:

pd.merge(left,right,on='姓名',how='outer',indicator='融合')

    姓名     年龄     籍贯     融合
0     q     18     湖北     both
1     w     19     北京     both
2     e     20     NaN     left_only
3     r     NaN     上海     right_only

# 不按共同列的融合,融合后共同列名自动增加后缀_x,_y

left = pd.DataFrame({'姓名1':['q','w','e'],'信息':['18','19','20']})

right = pd.DataFrame({'姓名2':['q','w','r'],'信息':['湖北','北京','上海']})

pd.merge(left,right,left_on='姓名1',right_on='姓名2',how='outer')

    姓名1     信息_x     姓名2     信息_y
0     q     18     q     湖北
1     w     19     w     北京
2     e     20     NaN     NaN
3     NaN     NaN     r     上海

# 使用suffixes利用原列名以及后缀组合形成新的列名:

pd.merge(left,right,left_on='姓名1',right_on='姓名2',how='outer',suffixes=('_left','_right'))

    姓名1     信息_left     姓名2     信息_right
0     q     18     q     湖北
1     w     19     w     北京
2     e     20     NaN     NaN
3     NaN     NaN     r     上海

# 创建left的索引为键, right的键为姓名的两个DataFrame :

left = pd.DataFrame({'年龄':['18','19','20']},index=['q','w','e'])

left.index.name='姓名'

right = pd.DataFrame({'姓名':['q','w','r'],'籍贯':['湖北','北京','上海']})

left

    年龄
姓名     
q     18
w     19
e     20

right

    姓名     籍贯
0     q     湖北
1     w     北京
2     r     上海

pd.merge(left,right,left_index=True,right_on='姓名',how='outer') # 或者使用join:left.join(right,on='姓名',how='outer')

    年龄     姓名     籍贯
0     18     q     湖北
1     19     w     北京
2     20     e     NaN
2     NaN     r     上海

# 创建left和right的索引都为键的两个DataFrame :

left = pd.DataFrame({'年龄':['18','19','20']},index=['q','w','e'])

left.index.name='姓名'

right = pd.DataFrame({'籍贯':['湖北','北京','上海']},index=['q','w','r'])

right.index.name='姓名'

# 使用pd.merge()

pd.merge(left,right,left_index=True,right_index=True,how='outer')

    年龄     籍贯
姓名         
e     20     NaN
q     18     湖北
r     NaN     上海
w     19     北京

# 使用join

left.join(right,how='outer')

    年龄     籍贯
姓名         
e     20     NaN
q     18     湖北
r     NaN     上海
w     19     北京

# DataFrame.combine_ first实例方法实现了用参数对象中的数据为调用者对象的缺失数据"打补丁”,并

 

posted @ 2020-12-14 11:19  celine227  阅读(150)  评论(0编辑  收藏  举报