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

Pandas技术问题:为每行统计满足自定义条件的其他行数

给Pandas DataFrame新增条件统计列的解决方案

嘿,这个需求我太熟了!本质上就是要让每一行和整个数据集做条件匹配,然后统计符合要求的行数对吧?我给你两种实用方案,按需选就行:

1. 直观易懂的apply方法(适合小数据集)

这种方法代码逻辑直白,新手也能一眼看懂,适合数据量不大的场景:

首先我们先构造一个示例人员数据集方便演示:

import pandas as pd

data = {
    '姓名': ['张三', '李四', '王五', '赵六'],
    '身高': [175, 180, 170, 185],
    '体重': [70, 65, 75, 60]
}
df = pd.DataFrame(data)

接下来定义一个统计函数,每传入一行数据,就和整个DataFrame对比「其他行身高更高且体重更轻」的条件,最后用sum()统计符合条件的行数:

def count_taller_and_lighter(row):
    # 同时满足两个条件:其他行身高>当前行身高,且其他行体重<当前行体重
    condition = (df['身高'] > row['身高']) & (df['体重'] < row['体重'])
    # True会被当作1,False当作0,sum就得到符合条件的总人数
    return condition.sum()

# 新增一列存储统计结果
df['更高更轻人数'] = df.apply(count_taller_and_lighter, axis=1)

运行后得到的结果是:

姓名   身高  体重  更高更轻人数
0  张三  175  70        2  # 李四、赵六符合条件
1  李四  180  65        1  # 只有赵六符合
2  王五  170  75        3  # 张三、李四、赵六都符合
3  赵六  185  60        0  # 没人比他更高更轻

优缺点

  • ✅ 优点:逻辑直观,代码容易调试和修改
  • ❌ 缺点:apply是逐行循环执行,当数据集超过一万行时,速度会明显变慢

2. 高效的矢量化方案(适合大数据集)

如果你的数据量很大(比如十万级以上),强烈推荐用这种基于numpy广播的矢量化方法,速度能比apply快几十倍甚至上百倍:

# 提取身高和体重的numpy数组
heights = df['身高'].values
weights = df['体重'].values

# 用广播生成二维对比矩阵:每一行代表当前行,每一列代表其他行
# heights[:, None] 把一维数组转成列向量,和原数组广播成n×n的矩阵
taller = heights[:, None] < heights  # 当前行身高 < 其他行身高 → 标记为True
lighter = weights[:, None] > weights  # 当前行体重 > 其他行体重 → 标记为True

# 两个条件同时满足,然后对每一行求和得到统计数
df['更高更轻人数_矢量化'] = (taller & lighter).sum(axis=1)

运行后得到的结果和apply方法完全一致,但执行效率天差地别——因为这里没有循环,完全是底层的数组运算。

注意事项

如果你的数据里有缺失值(NaN),记得先处理(比如用df.dropna()删除缺失行,或者用df.fillna()填充),不然对比结果会出现NaN,求和时可以加上skipna=True参数忽略这些值:

df['更高更轻人数_矢量化'] = (taller & lighter).sum(axis=1, skipna=True)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:09:20