由于合并变化较大,以后函数可能会修改,只给出一些例子作为参考
总结:
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')