熊猫:数据帧按行比较

时间:2020-02-29 02:22:30

标签: python pandas dataframe

我想以行方式比较两个数据帧的相等性。我对计算非联接属性具有相同值的行数很感兴趣。

例如

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上合并这两个数据帧。在两个数据帧中,有两行(前两行)的cd具有相同的值。

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

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)方式来达到相同的结果?

2 个答案:

答案 0 :(得分:1)

使用pandas merge ordered,与“内部”合并。从那里,您可以获取数据框形状,并扩展您的行数。

 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

答案 1 :(得分:1)

实现这一目标的更短方法:

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]})
df = df1.merge(df2, on=['a','b'])

comparison_cols = [c.strip('_x') for c in df.columns.tolist() if c.endswith("_x")]
num_rows_equal = (df1[comparison_cols][df1[comparison_cols] == df2[comparison_cols]].isna().sum(axis=1) == 0).sum()