首页 > 解决方案 > pandas:数据帧逐行比较

问题描述

我有两个数据框,我想以逐行方式比较它们的相等性。我有兴趣计算非连接属性具有相同值的行数。

例如,

import pandas as pd

df1 = pd.DataFrame({'a': [1,2,3,5], 'b': [2,3,4,6], 'c':[60,20,40,30], 'd':[50,90,10,30]})
df2 = pd.DataFrame({'a': [1,2,3,5], 'b': [2,3,4,6], 'c':[60,20,40,30], 'd':[50,90,40,40]})

我将在列ab. 有两行(前两行)在两个数据框中具有相同c的值。d

我目前正在使用以下方法,首先将这两个数据帧连接起来,然后计算每一行的值是否相等。

df = df1.merge(df2, on=['a','b'])
cols1 = [c for c in df.columns.tolist() if c.endswith("_x")]
cols2 = [c for c in df.columns.tolist() if c.endswith("_y")] 
num_rows_equal = 0

for index, row in df.iterrows():
    not_equal = False
    for col1,col2 in zip(cols1,cols2):
        if row[col1] != row[col2]:
            not_equal = True
            break
    if not not_equal:  # row values are equal
        num_rows_equal += 1

num_rows_equal

是否有更有效的(pythonic)方法来实现相同的结果?

标签: pythonpandasdataframe

解决方案


使用pandas merge ordered,与 'inner' 合并。从那里,您可以获得数据框形状并扩展您的行数。

 df_r = pd.merge_ordered(df1,df2,how='inner')

    a   b   c   d
0   1   2   60  50
1   2   3   20  90

no_of_rows = df_r.shape[0]

#print(no_of_rows)
#2

推荐阅读