python - 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]})
我将在列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)方法来实现相同的结果?
解决方案
使用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
推荐阅读
- elasticsearch - 使用 Elasticsearch 和 NestJS 服务器部署 Docker 容器
- reactjs - 使用自定义登录和后端实现 NextAuth 凭据时出错
- mysql - 如何在mysql中动态地将行旋转到列
- next.js - 错误:页面“getInitialProps”结果中的循环结构:Nextjs with apollo client
- c++ - Atom 不使用字符串运行 cpp 文件
- java - “出口到”和“需要传递”关键字
- android - 为什么我们需要 android Sdk 来创建 android 应用程序?
- php - 如何在 Session 中设置 Cookie
- javascript - 从 vuejs 中的搜索中选择数据时出错?
- ruby-on-rails - 使用顺风从资产管道插入背景图像