微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – 比较两个pandas数据帧的行的最快方法?

所以我有两个pandas数据帧,A和B.

A是1000行×500列,填充有表示存在或不存在的二进制值.

B是1024行×10列,并且是0和1的完整迭代,因此具有1024行.

我试图找到A中特定10列的A中的哪些行与B中的给定行相对应.我需要整行匹配,而不是逐个元素.

例如,我想要

A[(A.ix[:,(1,2,3,4,5,6,7,8,9,10)==(1,0,1,0,1,0,0,1,0,0)).all(axis=1)]

返回A中的行(3,5,8,11,15)与那些特定列的B(1,0,1,0,1,0,0,1,0,0)行匹配的内容(1,2,3,4,5,6,7,8,9,10)

我想在B的每一行都这样做.
我能想到的最好方法是:

import numpy as np
for i in B:
    B_array = np.array(i)
    Matching_Rows = A[(A.ix[:,(1,2,3,4,5,6,7,8,9,10)] == B_array).all(axis=1)]
    Matching_Rows_Index = Matching_Rows.index

对于一个实例来说这并不可怕,但我在一个运行大约20,000次的while循环中使用它;因此,它减慢了相当多的速度.

我一直在乱用DataFrame.apply无济于事.地图工作能更好吗?

我只是希望有人看到一些显然更高效的东西,因为我对python很新.

谢谢和最好的问候!

解决方法:

您可以将mergereset_index一起使用 – 输出是B的索引,它们在自定义列中的A中相等:

A = pd.DataFrame({'A':[1,0,1,1],
                  'B':[0,0,1,1],
                  'C':[1,0,1,1],
                  'D':[1,1,1,0],
                  'E':[1,1,0,1]})

print (A)
   A  B  C  D  E
0  1  0  1  1  1
1  0  0  0  1  1
2  1  1  1  1  0
3  1  1  1  0  1

B = pd.DataFrame({'0':[1,0,1],
                  '1':[1,0,1],
                  '2':[1,0,0]})

print (B)
   0  1  2
0  1  1  1
1  0  0  0
2  1  1  0
print (pd.merge(B.reset_index(), 
                A.reset_index(), 
                left_on=B.columns.tolist(), 
                right_on=A.columns[[0,1,2]].tolist(),
                suffixes=('_B','_A')))

   index_B  0  1  2  index_A  A  B  C  D  E
0        0  1  1  1        2  1  1  1  1  0
1        0  1  1  1        3  1  1  1  0  1
2        1  0  0  0        1  0  0  0  1  1    

print (pd.merge(B.reset_index(), 
                A.reset_index(), 
                left_on=B.columns.tolist(), 
                right_on=A.columns[[0,1,2]].tolist(),
                suffixes=('_B','_A'))[['index_B','index_A']])    

   index_B  index_A
0        0        2
1        0        3
2        1        1   

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐