如何用循环优化两个DataFrame列值全相等时的加分逻辑?
优化DataFrame列值匹配的评分代码
问题背景
你有两个列名完全一致的数值型DataFrame,需求是当两个DataFrame对应列的所有值都相等时,给初始值为0的score加10分。目前用手动逐个列判断的方式实现,代码冗余,想要用循环或更简洁的方法优化。
示例数据:
DataFrame 1
| Column A | Column B | Column C | Column D |
|---|---|---|---|
| 1 | 2 | 0 | 1 |
DataFrame 2
| Column A | Column B | Column C | Column D |
|---|---|---|---|
| 1 | 2 | 0 | 1 |
当前手动实现的代码:
score=0 if (df1['Column A'][0]==df2['Column A'][0])&(df1['Column B'][0]==df2['Column B'][0])&(df1['Column C'][0]==df2['Column C'][0])&(df1['Column D'][0]==df2['Column D'][0]): score=score+10
优化方案
方案1:用for循环遍历列验证
这种方式逻辑清晰,适合需要中途中断判断的场景:
score = 0 all_match = True # 遍历所有列名 for col in df1.columns: # 检查当前列所有值是否完全相等 if not df1[col].equals(df2[col]): all_match = False break if all_match: score += 10
方案2:直接用DataFrame的equals方法(最简洁)
因为两个DataFrame列名一致,直接判断整个DataFrame是否完全相等即可,一步到位:
score = 0 if df1.equals(df2): score += 10
方案3:用生成器表达式快速验证
通过all()函数批量判断所有列是否都匹配,代码更紧凑:
score = 0 if all(df1[col].equals(df2[col]) for col in df1.columns): score += 10
补充:如果只需要验证某一行(比如第0行)
如果你的需求其实是验证某一行的所有列值相等(比如示例代码里只判断了[0]索引的行),可以改成:
score = 0 if df1.iloc[0].equals(df2.iloc[0]): score += 10
注意点
series.equals()方法会严格检查数据值、索引、数据类型是否完全一致,比逐元素==判断更严谨,能避免一些隐式类型转换导致的错误。
内容的提问来源于stack exchange,提问作者Agustin Tettamanti
相关产品推荐
相关产品推荐

