Python中數據合併concatenate,merge,concat,join等用法

轉載地址

numpy中的concatenate()

>>> a = np.array([[1, 2], [3, 4]])
>>> b = np.array([[5, 6]])
>>> np.concatenate((a, b), axis=0)
array([[1, 2],
       [3, 4],
       [5, 6]])
>>> np.concatenate((a, b.T), axis=1)
array([[1, 2, 5],
       [3, 4, 6]])
 
注意:用到這個方法的時候很容易報dimensions不同的錯誤,有的需要更改demensions
可以使用下面的兩種方法
# 給每一個元素增加[]
y_resamplednew  = y_resampled[:,np.newaxis]
print(y_resamplednew)
# 給最外層增加一個[]
y_resamplednew2 = y_resampled[np.newaxis,:]
print(y_resamplednew2)

pandas中的merge,concat,join

# In[]:數據的合併
# 1 ,merge,類似數據庫中的
# (1)內連接,pd.merge(a1, a2, on='key')
# (2)左連接,pd.merge(a1, a2, on='key', how='left')
# (3)右連接,pd.merge(a1, a2, on='key', how='right')
# (4)外連接, pd.merge(a1, a2, on='key', how='outer')
data1 = pd.DataFrame(
    np.arange(0,16).reshape(4,4),
    columns=list('abcd')
)
data1
data2 = [
    [4,1,5,7],
    [6,5,7,1],
    [9,9,123,129],
    [16,16,32,1]
]
data2 = pd.DataFrame(data2,columns = ['a','b','c','d'])
data2
# 內連接 ,交集
pd.merge(data1,data2,on=['b'])
# 左連接 注意:如果 on 有兩個條件,on = ['a','b']
# how = 'left','right','outer'
pd.merge(data1,data2,on='b',how='left')
 
# 2,append,相當於R中的rbind
# ignore_index = True:這個時候 表示index重新記性排列,而且這種方法是複製一個樣本
data1.append(data2,ignore_index = True)
 
# 3,join
data2.columns=list('pown')
# 列名不能重疊:在這裏的用法和R中rbind很像,但是join的用法還是相對麻煩的
result = data1.join(data2)
result
 
# 4,concat 這個方法能夠實現上面所有的方法的效果
# concat函數是pandas底下的方法,可以把數據根據不同的軸進行簡單的融合
# pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,
#        keys=None, levels=None, names=None, verify_integrity=False)
 
# 參數說明:
# objs:series,dataframe,或者panel構成的序列list
# axis:0 行,1列
# join:inner,outer
 
# a,相同字段表首尾巴相接
data1.columns = list('abcd')
data2.columns =list('abcd')
data3 = data2
# 爲了更好的查看連接後的數據來源,添加一個keys更好查看
pd.concat([data1,data2,data3],keys=['data1','data2','data3'])
 
# b ,列合併(也就是行對齊):axis = 1,
 
pd.concat([data1,data2,data3],axis = 1,keys = ['data1','data2','data3'])
 
data4 = data3[['a','b','c']]
# 在有些數據不存在的時候,會自動填充NAN
pd.concat([data1,data4])
 
# c:join:inner 交集,outer ,並集
pd.concat([data1,data4],join='inner')
 
# 在列名沒有一個相同的時候會報錯
# data4.index = list('mnp')
# pd.concat([data1,data4])
 
 
 
# In[]:我們再看其他的資料:################################
# 數據的規整化
 
###############################################################
############################合併數據集##########################
 
# pandas.merge;實現的就是數據庫的操作,有點像sql的操作
# pandas.concat:可以沿着一條軸將多個對象堆疊到一起
 
# 一個簡單的例子:
import pandas as pd
 
df1 = pd.DataFrame({'key':['b','b','a','c','a','a','b'],'data1':range(7)})
df2 = pd.DataFrame({'key':['a','b','d'],'data2':range(3)})
 
# merge默認是交集,如果沒有指定哪個列進行連接,merge就會將重疊列的列名當做鍵
print(pd.merge(df1,df2))
print(pd.merge(df1,df2,on='key'))
 
# 如果兩個對象的列名不同,也可以進行顯示的指定
 
df3 = pd.DataFrame({'lkey':['b','b','a','c','a','a','b'],'data1':range(7)})
df4 = pd.DataFrame({'rkey':['a','b','d'],'data2':range(3)})
 
print(pd.merge(df3,df4,left_on='lkey',right_on='rkey'))
 
# ########################## merge還有how = left,right,outer
print(pd.merge(df1,df2,how = 'left'))
 
# In[]:合併多個數據集,傳入一個由列名組成的列表即可:
left = pd.DataFrame({'key1':['foo','foo','bar'],'key2':['one','two','one'],'lval':[1,2,3]})
right = pd.DataFrame({'key1':['foo','foo','bar','bar'],'key2':['one','one','one','two'],'lval':[4,4,6,7]})
 
print(left,'\n',right)
# outer相當於並集
print(pd.merge(left,right,on=['key1','key2'],how = 'outer'))
 
# 對於上面的代碼,我們可以這樣理解,多個鍵形成一系列元祖,並將其當做當個連接鍵進行連接(實際不是這樣)
 
# In[]需要考慮的是重複列名的問題:
# 他會自動進行重新命名
print(pd.merge(left,right,on=['key1','key2'],how = 'inner'))
 
# 如果我們想自定義:(和原來的名字進行的疊加)
print(pd.merge(left,right,on=['key1','key2'],how = 'inner',suffixes = ('_left','_right')))
 
'''
merge:函數的參數:
on:用於連接的列名
left_on,right_on :左側(右側)用於連接鍵的列
left_index(right_index):將左(右)側的行索引作爲連接鍵
sort:對於合併後的數據進行排列,默認爲true,對於數據量比較大的時候,把他設置爲False,性能更好
suffixes:默認爲('_x','_y')
copy:默認爲True,可以改爲False,數據量比較大時
'''
# In[]:索引上的合併:
left1 = pd.DataFrame({'key':['a','b','a','a','b','c'],'value':range(6)})
right1 = pd.DataFrame({'group_val':[3.5,7]},index=['a','b'])
 
print(pd.merge(left1,right1,left_on='key',right_index=True))
 
# 當然 對於通過索引的合併,DataFrame還有一個join方法,更加方便的實現索引的合併
print(left1.join(right1,how='outer'))
 
 
# In[] #################################################################################
# ****************************** 軸向連接concat **********************************
####################################################################################
 
s1 = pd.Series([0,1],index=['a','b'])
s2 = pd.Series([2,3,4],index=list('cde'))
s3 = pd.Series([5,6],index=list('fg'))
 
print(pd.concat([s1,s2,s3]))
 
s4 = pd.concat([s1*5,s3])
 
# join_axes指定軸上使用的索引,如果沒有對應的,自動填充空值
print(pd.concat([s1,s4],axis=1,join_axes=[['a','c','b','e']]))
 
# ############################# 使用keys 可以區分拼接的數據來自哪裏
result = pd.concat([s1,s2,s3],keys=['s1','s2','s3'])
print(result)
 
# 很多時候,通過concat的時候行索引可能會沒有特別的意義,或者因爲你索引類型不一樣而沒法concat的時候
# 我們需要使用 使用 ignore_index = True
 
result = pd.concat([s1,s2,s3],keys=['s1','s2','s3'],ignore_index=True)
print(result)
 
# In[]:################################
############# 重疊數據的合併處理:也就是在索引相同的時候,也可以直接使用concat
#  np.where :if-else的矢量化操作
import numpy as np
 
a = pd.Series([np.nan,2.5,np.nan,3.5,4.5,8],index=list('fedcba'))
b = pd.Series(np.arange(len(a),dtype=np.float64),index=list('fedcba'))
b[-1] = np.nan
 
print(a,'\n',b)
print(np.where(pd.isnull(a),b,a))
 
# print(pd.concat([a,b]))
print('/nn')
print(b.combine_first(a))

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章