You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python实现NumPy数组及DataFrame每行与其他行的Element-wise比较?

解决方案

我们可以利用NumPy的广播特性高效实现行与行之间的逐元素全量比较,以下是针对你的需求的具体实现:

1. 基础实现(以第0行为目标行)

先提取目标行,再通过广播完成逐元素比较,最后筛选出符合条件的行:

import pandas as pd
import numpy as np

# 初始化示例DataFrame
df = pd.DataFrame({"c1":[5,2,4,3], "c2":[8,9,5,7], "c3":[9,5,11,8]})

# 获取目标行的数值数组(这里取第0行)
target_row = df.iloc[0].values

# 逐元素比较:目标行 > 所有行,返回布尔值数组
compare_matrix = target_row > df.values
# 对每行的布尔结果取逻辑与,判断该行所有元素是否都小于目标行
all_elements_smaller = compare_matrix.all(axis=1)
# 排除目标行自身
filter_mask = all_elements_smaller & (df.index != 0)

# 输出符合条件的行
result = df[filter_mask]
print(result)

运行结果:

c1  c2  c3
3   3   7   8

2. 通用化函数(支持任意行作为目标)

如果需要对每一行都执行该逻辑,可以封装成函数:

def get_all_smaller_rows(df, target_row_idx):
    target_vals = df.iloc[target_row_idx].values
    # 逐行判断是否所有元素都小于目标行
    is_smaller = (target_vals > df.values).all(axis=1)
    # 屏蔽目标行自身
    is_smaller[target_row_idx] = False
    return df[is_smaller]

# 测试第0行
print(get_all_smaller_rows(df, 0))

# 遍历所有行查看结果
for idx in df.index:
    print(f"\n第{idx}行对应的符合条件的行:")
    print(get_all_smaller_rows(df, idx))

核心逻辑说明

  • target_row > df.values:利用NumPy广播机制,将1维的目标行数组与2维的DataFrame数值数组进行逐元素比较,生成同形状的布尔矩阵。
  • .all(axis=1):对每行的布尔值取逻辑与,只有当该行所有元素都满足小于目标行时,结果才为True。
  • 最后通过索引过滤掉目标行自身,得到最终结果。

内容的提问来源于stack exchange,提问作者Dinc Kirikci

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 10:36:06