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