如何基于指定列分组用循环取另一列最小值行并合并为单个DataFrame?
实现方案
你不需要手动提取行业唯一值写循环,用Pandas原生的分组方法即可高效完成需求,10万行数据、动态变化的30个行业都可以直接适配,运行效率远高于自定义循环。
核心实现代码如下:
# 生成布尔掩码:标记每行是否属于所在行业的Amount outstanding最小值行 min_row_mask = df['Amount outstanding'] == df.groupby('Industry')['Amount outstanding'].transform('min') # 筛选行并重置索引得到结果表 Min_Value = df[min_row_mask].reset_index(drop=True)
上述代码的transform方法会把每个行业分组的最小值广播到组内所有行的位置,生成和原DataFrame长度一致的布尔数组,筛选后会自动保留同一行业下所有达到最小值的行,完全匹配你的需求。
如果你需要按你原本的循环思路实现,参考写法如下(性能低于上述原生方法,仅做参考):
# 提取所有唯一行业 industry_list = df['Industry'].unique() Min_Value = pd.DataFrame() # 遍历每个行业筛选最小值行 for industry in industry_list: # 筛选当前行业的所有行 industry_df = df[df['Industry'] == industry] # 取当前行业最小值 industry_min = industry_df['Amount outstanding'].min() # 筛选当前行业最小值行 min_rows = industry_df[industry_df['Amount outstanding'] == industry_min] # 合并到结果表 Min_Value = pd.concat([Min_Value, min_rows], ignore_index=True)
两种方法在你给出的示例数据上运行,得到的Min_Value结果一致:
| Security ID | Industry | Amount outstanding |
|---|---|---|
| we9lkl | Airplanes | 31 |
| as5322 | Oil | 21 |
| ot24tas | Housing | 29 |
| c34ci46a8 | Trucking | 29 |
内容的提问来源于stack exchange,提问作者Sumit
相关产品推荐
相关产品推荐

