【问题标题】:Any way to replace pandas pd.merge?有什么方法可以替换 pandas pd.merge?
【发布时间】:2016-10-20 15:01:37
【问题描述】:

我有两个数据框

>>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) 我试图按列 ['A']['B'] 删除 df1 中不在 df2 中的行。
(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  

但是,我遇到了一个逻辑错误,我不知道如何解决这个问题。 任何人都可以帮忙吗?

【问题讨论】:

  • 你试过df3 = pd.merge(df1,df2,how='inner',on=['A','B']) 吗?
  • @JoeR 是的,我试过了。遇到同样的问题
  • 根据您的真实数据,您可能需要对部分/所有列进行分类 - 这可能会节省一些 RAM,尤其是当列中有大量重复值时

标签: python pandas


【解决方案1】:

你可以试试concatset_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

【讨论】:

  • 好吧....我有一个关于Exception: cannot handle a non-unique multi-index!的异常
  • 我认为您在使用 concat 时会出错。使用boolean indexing 和合并的最后一个解决方案如何工作?
  • 仍然太大而无法合并 :'(
  • 我很害怕 :(
  • 你的内存大小是多少?
【解决方案2】:

使用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])

【讨论】:

    猜你喜欢
    • 2011-08-20
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    相关资源
    最近更新 更多