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
相关产品推荐
相关产品推荐

