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

