python merge、join、concat用法與區別


 由於合並變化較大,以后函數可能會修改,只給出一些例子作為參考

總結:

merge、join

1、當沒有索引時:merge、join為按照一定條件合並

2、當有索引、並按照索引合並時,得到結果為兩者混合到一起了,重新按照一定規則排序了。

3、當沒有索引時、concat不管列名,直接加到一起,可以加到后面、也可以加到右邊,axis=0為加到后面,axis=1為加到右邊,左邊的數據結構沒有變,變的是右邊數據結構。

4、當有索引、並按照索引合並時,得到結果兩者混合到一起了。

import pandas as pd import numpy as np from pandas import DataFrame,Series data1=pd.DataFrame(np.arange(6).reshape(2,3),columns=list('abc')) data2=pd.DataFrame(np.arange(20,26).reshape(2,3),columns=list('ayz')) data1 Out[33]: a b c 0 0 1  2
1  3  4  5 data2 Out[34]: a y z 0 20  21  22
1  23  24  25 data=pd.concat([data1,data2],axis=0) data Out[22]: a b c y z 0 0 1.0  2.0 NaN NaN 1   3  4.0  5.0 NaN NaN 0 20  NaN  NaN  21.0  22.0
1  23  NaN  NaN  24.0  25.0 data=pd.concat([data1,data2],axis=1) data Out[24]: a b c a y z 0 0 1  2  20  21  22
1  3  4  5  23  24  25 data=pd.merge(data1,data2) data Out[26]: Empty DataFrame Columns: [a, b, c, y, z] #a列沒有共同元素
Index: [] data=pd.merge(data1,data2,on='a') data Out[28]: Empty DataFrame Columns: [a, b, c, y, z] Index: [] data=pd.merge(data1,data2,on='a',how='outer') data Out[30]: data Out[30]: a b c y z 0 0 1.0  2.0 NaN NaN 1   3  4.0  5.0 NaN NaN 2  20  NaN  NaN  21.0  22.0
3  23  NaN  NaN  24.0  25.0 data=pd.merge(data1,data2,how='outer') data Out[32]: a b c y z 0 0 1.0  2.0 NaN NaN 1   3  4.0  5.0 NaN NaN 2  20  NaN  NaN  21.0  22.0
3  23  NaN  NaN  24.0  25.0

 

 MJ數據處理:

方法一:reindex

A(少量數據)中數據按照B的數據重新排序,再將A中數據放入到B某一列中

這樣不行,重排列后A中特有數據沒有了

import pandas as pd import numpy as np from pandas import DataFrame,Series data_a=pd.read_excel('A.xlsx',index_col=2).loc[:,'授信敞口額度'];print(data_a.head()) data_b=pd.read_excel('B.xlsx',index_col=0);print(data_b.head()) data_a=data_a.reindex(index=data_b.index) data_b.iloc[:,9]=data_a data_b.to_excel('new_data.xlsx')

方法二:concat

https://stackoverflow.com/questions/27719407/pandas-concat-valueerror-shape-of-passed-values-is-blah-indices-imply-blah2

print(data_a.index.is_unique,data_b.index.is_unique) data=pd.concat([data_b,data_a],axis=1) #True False #ValueError: Shape of passed values is (21, 378), indices imply (21, 288)
因為索引有重復項,所以不能concat

dataframe中去掉重復行

https://stackoverflow.com/questions/13035764/remove-rows-with-duplicate-indices-pandas-dataframe-and-timeseries/34297689#34297689

df3 = df3[~df3.index.duplicated(keep='first')]
#下面只能去掉同樣的行,不能去掉索引相同行元素不同行
data_a.drop_duplicates(inplace=True);data_b.drop_duplicates(inplace=True)
data=pd.concat([data_b,data_a],axis=1)

還是不可以,由於有索引,結果會按照索引排序。

方法三:join

data=data_b.join(data_a,how='outer') data.to_excel('data_join.xlsx')

也不可以,排序不是按照B中的數據在前,A中有B中沒有數據在后,不太滿足要求,較前面兩種方法好

方法四:merge

data=pd.merge(data_b,data_a,left_index=True,right_index=True,how='outer') data.to_excel('data_merge.xlsx')

與join方法得到結果一致,一樣功能,不太滿足需求。

方法五:merge

##合並數據不放在索引上,放在列上,沒有索引,按列進行合並,結果直接在后面加,排列默認以合並左邊列先排列,再排右邊列。 #如果把公共列放在索引上,則返回結果會排序,merge、concat、join都會。
a = pd.read_excel('8月.xlsx') b = pd.read_excel('8月末.xlsx') print(b.head(),a.head()) c=pd.merge(a,b,on='客戶名稱',how='outer')


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM