如何按变量组基于多条件高效处理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如下:
| name | name_group | value | new_vals |
|---|---|---|---|
| foo1 | a | 2 | 2 |
| foo2 | a | 2 | 2 |
| foo3 | a | 2 | 2 |
| foo4 | a | 2 | 2 |
| bar1 | b | NaN | NaN |
| bar2 | b | NaN | NaN |
| bar3 | b | NaN | NaN |
| buzz1 | c | 6 | 5 |
| buzz2 | c | 6 | 5 |
| buzz3 | c | 6 | 5 |
| buzz4 | c | 6 | 5 |
| buzz5 | c | 6 | 5 |
为什么这种方法高效?
- 用
groupby+transform替代了逐行循环,Pandas的分组操作是基于底层优化的,速度远快于手动遍历 - 用NumPy的向量化函数
np.minimum和np.where处理列级计算,避免了apply逐行处理的低效问题,适合大规模数据集
内容的提问来源于stack exchange,提问作者Nizag
相关产品推荐
相关产品推荐

