Python 熊猫:数据帧行比较

Python 熊猫:数据帧行比较,python,pandas,dataframe,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]

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

比如说,

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]})
我将在列
a
b
上连接这两个数据帧。两个数据帧中有两行(前两行)的
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)方法来达到同样的效果?

使用,与“内部”合并。从那里,您可以得到您的数据帧形状,并通过扩展您的行数

 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
使用,与“内部”合并。从那里,您可以得到您的数据帧形状,并通过扩展您的行数

 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

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

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()

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

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()

这是一个0表示行相等,1表示行不相等的序列。在
sum(axis=1)
之后返回的序列是这样的,但是在与0比较和求和之后,
num rows\u equal
中设置的值是2。这是一个0表示行相等,1表示行不相等的序列。在
sum之后返回的序列(axis=1)
就是这样,但是在比较0和求和之后,
num_rows_equal
中设置的值是2