【问题标题】:Element wise dataframe comparison and performing of conditional operations元素明智的数据帧比较和条件操作的执行
【发布时间】:2019-08-08 22:55:31
【问题描述】:

假设我有这两个数据框:

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

我怎样才能完成这项工作并修复此错误?

谢谢

【问题讨论】:

  • 您能否向我们展示最终的预期数据帧?谢谢

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


【解决方案1】:

另一种方法是使用掩码(尽可能避免在 pandas 中使用 for 循环):

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

【讨论】:

    【解决方案2】:

    您可以简单地使用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?
    • @Miguel2488 你的意思是加+1? s['_merge'].eq('both').cumsum(),这样吗?
    • 如果条件满足,更像是在计数器变量中添加 +=1
    • @Miguel2488 如果你确实需要一个计数器,你可以使用 for 循环合并后的结果,就在 '_merge' 等于 'both' 时,计数器加 1
    猜你喜欢
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-29
    • 2021-08-01
    相关资源
    最近更新 更多