有什么办法可以取代pandas pd.merge?

时间:2016-10-19 08:40:44

标签: python pandas

我有两个数据帧

>>df1.info()
>><class 'pandas.core.frame.DataFrame'>
  Int64Index: 2598374 entries, 3975 to 3054366
  Data columns (total 14 columns): ......
>>df2.info()
>><class 'pandas.core.frame.DataFrame'>
  Int64Index: 2520405 entries, 2066 to 2519507
  Data columns (total 5 columns): ......

我想要内心加入他们。我试过pd.merge,我得到了内存错误。因此,我尝试在没有pd.merge的情况下做同样的事情。

原始方法的示例数据帧(失败:内存错误)

df1 = pd.DataFrame({'A': ['1', '2', '3', '4','5'],
              'B': ['1', '1', '1', '1','1'],
              'C': ['c', 'A1', 'a', 'c3','a'],
              'D': ['B1', 'B1', 'B2', 'B3','B4'],
              'E': ['3', '3', '3', '3','3'],
              'F': ['3', '4', '5', '6','7'],
              'G': ['2', '2', '2', '2','2']})

df2 = pd.DataFrame({'A': ['1', '2',  '8','4'],
              'B': ['1', '2',  '5','1'],
              'x': ['3', '3', '2','2'],
              'y': ['3', '4', '6','7'],
              'z': ['2', '2', '2','2']})
>>   df1
         A  B   C   D  E  F  G
      0  1  1   c  B1  3  3  2
      1  2  1  A1  B1  3  4  2
      2  3  1   a  B2  3  5  2
      3  4  1  c3  B3  3  6  2
      4  5  1   a  B4  3  7  2

     df2
         A  B  x  y  z
      0  1  1  3  3  2
      1  2  2  3  4  2
      2  8  5  2  6  2
      3  4  1  2  7  2

df1 = pd.merge(df1,df2,how='inner',on=['A','B']) 

>>   df1    
         A  B   C   D  E  F  G  x  y  z
      0  1  1   c  B1  3  3  2  3  3  2
      1  4  1  c3  B3  3  6  2  2  7  2

新方法的示例
(1)我试图删除df1中不在df2中的行[&#39; A&#39;] [&#39; B&#39;]。
(2)将x,y,z列连接到df1

df1 = pd.DataFrame({'A': ['1', '2', '3', '4','5'],
              'B': ['1', '1', '1', '1','1'],
              'C': ['c', 'A1', 'a', 'c3','a'],
              'D': ['B1', 'B1', 'B2', 'B3','B4'],
              'E': ['3', '3', '3', '3','3'],
              'F': ['3', '4', '5', '6','7'],
              'G': ['2', '2', '2', '2','2']})

df2 = pd.DataFrame({'A': ['1', '2',  '8','4'],
              'B': ['1', '2',  '5','1'],
              'x': ['3', '3', '2','2'],
              'y': ['3', '4', '6','7'],
              'z': ['2', '2', '2','2']})
>>   df1
         A  B   C   D  E  F  G
      0  1  1   c  B1  3  3  2
      1  2  1  A1  B1  3  4  2
      2  3  1   a  B2  3  5  2
      3  4  1  c3  B3  3  6  2
      4  5  1   a  B4  3  7  2

     df2
         A  B  x  y  z
      0  1  1  3  3  2
      1  2  2  3  4  2
      2  8  5  2  6  2
      3  4  1  2  7  2

df1 = df1.loc[((df1['A'].isin(df2.A)) & (df1['B'].isin(df2.B)) ) ]

>>   df1    
         A  B   C   D  E  F  G  
      0  1  1   c  B1  3  3  2  
      1  2  1  A1  B1  3  4  2
      3  4  1  c3  B3  3  6  2  

然而,我遇到了逻辑错误,我不知道解决这个问题。 有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

您可以使用concat尝试set_index

df1 = pd.concat([df1.set_index(['A','B']),
                 df2.set_index(['A','B'])], axis=1, join='inner')
print (df1)              
      C   D  E  F  G  x  y  z
A B                          
1 1   c  B1  3  3  2  3  3  2
4 1  c3  B3  3  6  2  2  7  2

或与boolean indexing组合:

df1 = df1[((df1['A'].isin(df2.A)) & (df1['B'].isin(df2.B)) ) ]
print (df1)
   A  B   C   D  E  F  G
0  1  1   c  B1  3  3  2
1  2  1  A1  B1  3  4  2
3  4  1  c3  B3  3  6  2

df2 = df2[((df2['A'].isin(df1.A)) & (df2['B'].isin(df1.B)) ) ]
print (df2)
   A  B  x  y  z
0  1  1  3  3  2
3  4  1  2  7  2

df3 = pd.concat([df1.set_index(['A','B']),
                 df2.set_index(['A','B'])], axis=1, join='inner')
print (df3)              
      C   D  E  F  G  x  y  z
A B                          
1 1   c  B1  3  3  2  3  3  2
4 1  c3  B3  3  6  2  2  7  2

如果过滤后df1不大,请使用merge

df1 = df1[((df1['A'].isin(df2.A)) & (df1['B'].isin(df2.B)) ) ]
print (df1)
   A  B   C   D  E  F  G
0  1  1   c  B1  3  3  2
1  2  1  A1  B1  3  4  2
3  4  1  c3  B3  3  6  2

df2 = df2[((df2['A'].isin(df1.A)) & (df2['B'].isin(df1.B)) ) ]
print (df2)
   A  B  x  y  z
0  1  1  3  3  2
3  4  1  2  7  2

df3 = pd.merge(df1,df2, on=['A','B']) 
print (df3)              
   A  B   C   D  E  F  G  x  y  z
0  1  1   c  B1  3  3  2  3  3  2
1  4  1  c3  B3  3  6  2  2  7  2

答案 1 :(得分:0)

使用isin()然后使用pd.concat会出现一些多索引问题 我通过np.array_split解决了这个问题。

第1步: 将数据帧拆分为5个数据帧

dfa,dfb,dfc,dfd,dfe = np.array_split(df1,5)

第2步: 单独合并

dfa = pd.merge(dfa,df2,how='inner',on=['A','B'])
dfb = pd.merge(dfb,df2,how='inner',on=['A','B'])
dfc = pd.merge(dfc,df2,how='inner',on=['A','B'])
dfd = pd.merge(dfd,df2,how='inner',on=['A','B'])
dfe = pd.merge(dfe,df2,how='inner',on=['A','B'])

第3步: 将它们附加到一个数据框

result = dfa.append([dfb, dfc,dfd,dfe])