1. 程式人生 > 實用技巧 >Pandas資料連線

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例項方法實現了用引數物件中的資料為呼叫者物件的缺失資料"打補丁”,並