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

Pandas实现多列超出允许最大值的数值拆分为等长bin并生成新行

Pandas多列同时超阈值拆分实现方案

核心逻辑优先取所有超阈值列的拆分bin数最大值作为该行的总拆分行数,保证多列同时超出时所有拆分需求都被覆盖,再逐列计算每个bin的对应值即可,完整实现流程如下:


前置依赖

需要提前导入pandas和numpy库:

import pandas as pd
import numpy as np

实现步骤

步骤1:计算每行拆分行数

先对所有数据列单独计算拆分bin数,再取最大值作为该行的最终拆分次数,适配多列同时超阈值的场景:

# 按需指定数据列、最大值列名称
data_cols = ["Data1", "Data2"]
max_col = "Max. Allowed"

# 计算每个数据列超出阈值时需要拆分的bin数,未超出则为1
bin_counts = df[data_cols].apply(lambda x: np.ceil(x / df[max_col]).astype(int))
# 每行取最大bin数作为总拆分次数
df["split_times"] = bin_counts.max(axis=1)

步骤2:展开生成新行并标注原索引

按拆分次数重复原行,同时生成符合要求的新索引,将原索引标注在括号内:

# 按拆分次数重复原行
expanded_df = df.loc[df.index.repeat(df["split_times"])].reset_index(names="original_idx")
# 生成每个原索引对应的bin序号
expanded_df["bin_seq"] = expanded_df.groupby("original_idx").cumcount() + 1
# 生成新索引:格式为「新序号(原索引)」,可按需调整模板
expanded_df.index = [f"{i}({row['original_idx']})" for i, row in expanded_df.iterrows()]

步骤3:计算各列拆分后的bin值

逐列判断是否需要拆分,按整数除法拆分数值,保证所有bin的总和等于原值:

for col in data_cols:
    expanded_df[col] = expanded_df.apply(
        lambda row: min(
            row[max_col],
            row[col] - (row["bin_seq"] - 1) * row[max_col]
        ) if row["bin_seq"] <= bin_counts.loc[row["original_idx"], col] else 0,
        axis=1
    )

# 删除计算过程中的辅助列,得到最终结果
final_df = expanded_df.drop(columns=["original_idx", "bin_seq", "split_times"])

可调整规则

  • 不需要拆分的列在超出自身bin数的行中默认填0,可调整else后的数值改为保留原值或其他默认值
  • 新索引格式可通过修改索引生成行的字符串模板调整

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 14:15:01