元素明智的数据帧比较和条件操作的执行

时间:2019-03-18 14:26:24

标签: python python-3.x pandas loops dataframe

假设我有以下两个数据帧:

a = pd.DataFrame(columns = ['a','b'], data = [[1,2],[3,4], [5,6],[7,8]])
b = pd.DataFrame(columns = ['a','b'], data = [[1,2],[7,4], [9,6],[11,8]])

我想做的是将a的每个元素与b的每个元素进行比较,如果有匹配项,则在计数器中加+1,如果没有匹配项,我想将不匹配的行附加到上面的空数据框中。

到目前为止,这是我的代码:

counter = 0
counts = pd.DataFrame()

for i, j in a.iterrows():
    for a, row in b.iterrows():

        if a[j] == b[row]:
            counter += 1

        else:

            counts = counts.append(a[row])

当我运行它时,出现此错误:

TypeError: 'int' object is not subscriptable

我该如何解决并解决此错误?

谢谢

2 个答案:

答案 0 :(得分:1)

您可以将mergeindicator一起使用

s=a.merge(b,indicator=True,how='outer')
s
Out[481]: 
    a  b      _merge
0   1  2        both
1   3  4   left_only
2   5  6   left_only
3   7  8   left_only
4   7  4  right_only
5   9  6  right_only
6  11  8  right_only

您的数量

s['_merge'].eq('both').sum()
Out[482]: 1

新df

newdf=s.loc[s['_merge']=='right_only',:].copy().drop('_merge',1)

答案 1 :(得分:1)

另一种方法是使用遮罩(尽可能避免在熊猫中for循环):

m = (a==b).apply(np.all, axis=1)   #assuming you want both elements to be equal
counts = a[~m].copy()
counter = m.sum()