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')
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值