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

如何按变量组基于多条件高效处理DataFrame并生成new_vals列?

解决方案:基于分组聚合高效计算新列

针对你的需求,我们可以利用Pandas的分组(groupby)和向量化操作来高效处理,避免逐行循环的低效问题。下面是具体步骤和代码:

首先,先构建你的示例DataFrame(方便测试):

import pandas as pd
import numpy as np

input_df = pd.DataFrame({
    'name': ['foo1', 'foo2', 'foo3', 'foo4', 'bar1', 'bar2', 'bar3', 'buzz1', 'buzz2', 'buzz3', 'buzz4', 'buzz5'],
    'name_group': ['a', 'a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'c', 'c'],
    'value': [2, 2, 2, 2, np.nan, np.nan, np.nan, 6, 6, 6, 6, 6]
})

接下来分三步实现需求:

1. 分组计算每组的核心统计量

我们需要每个name_group的两个值:

  • 组内的行数(group_size)
  • 组内value的最小值(自动忽略缺失值,全缺失时结果为NaN)

用transform方法可以直接把分组结果广播到原DataFrame的每一行,无需额外合并操作:

# 计算每组行数,广播到每行
input_df['group_size'] = input_df.groupby('name_group')['name'].transform('size')
# 计算每组value的最小值,广播到每行
input_df['value_min'] = input_df.groupby('name_group')['value'].transform('min')

2. 计算new_vals列

利用NumPy的向量化函数np.minimum计算两个列的最小值,同时用np.where处理value_min为缺失的情况(比如name_group=b的情况):

# 取group_size和value_min的较小值,全缺失组设为NaN(可按需修改为0或其他值)
input_df['new_vals'] = np.where(
    pd.notna(input_df['value_min']),
    np.minimum(input_df['group_size'], input_df['value_min']),
    np.nan  # 这里如果需要默认值,比如0,直接替换即可
)

3. (可选)清理临时列

如果不需要保留group_size和value_min这两个临时列,可以删除:

input_df = input_df.drop(columns=['group_size', 'value_min'])

最终结果

处理后的DataFrame如下:

namename_groupvaluenew_vals
foo1a22
foo2a22
foo3a22
foo4a22
bar1bNaNNaN
bar2bNaNNaN
bar3bNaNNaN
buzz1c65
buzz2c65
buzz3c65
buzz4c65
buzz5c65

为什么这种方法高效?

  • 用groupby+transform替代了逐行循环,Pandas的分组操作是基于底层优化的,速度远快于手动遍历
  • 用NumPy的向量化函数np.minimum和np.where处理列级计算,避免了apply逐行处理的低效问题,适合大规模数据集

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:03:09