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

如何复制Pandas行直至Date_Numerical字段值低于30.5阈值

问题分析
  • 现有代码存在两个核心问题:
    1. 判断阈值不符合要求:需求是Date_Numerical大于30.5才触发拆分,代码中写的是大于30,边界值判断会出错
    2. 仅做了单次行复制,对于需要拆分多次的数值(如示例中的110需要拆分出4行)无法覆盖,因此无法得到预期结果
解决方案

方案1:逐行迭代实现(逻辑易理解,适合小数据量)

import pandas as pd

def split_row(row):
    rows_list = []
    current_date_val = row['Date_Numerical']
    # 只要数值大于等于30.5就持续生成新行
    while current_date_val >= 30.5:
        temp_row = row.copy()
        temp_row['Date_Numerical'] = current_date_val
        rows_list.append(temp_row)
        current_date_val -= 30
    # 补充最后一个低于30.5的行
    temp_row = row.copy()
    temp_row['Date_Numerical'] = current_date_val
    rows_list.append(temp_row)
    return pd.DataFrame(rows_list)

# 测试原始数据
df = pd.DataFrame({'SCU_KEY':         [3, 4, 5, 6],
                   'Date_Numerical':  [70, 20, 15, 110]})

# 合并所有拆分后的行
df_2 = pd.concat([split_row(row) for _, row in df.iterrows()], ignore_index=True)

运行后输出与你给出的期望结果完全一致。

方案2:向量化实现(无循环,效率更高,适合十万行以上的大数据量)

import pandas as pd
import numpy as np

df = pd.DataFrame({'SCU_KEY':         [3, 4, 5, 6],
                   'Date_Numerical':  [70, 20, 15, 110]})

# 计算每行需要生成的行数
df['repeat_cnt'] = np.ceil((df['Date_Numerical'] - 0.5) / 30).astype(int)
# 按计算出的次数重复行
df_2 = df.loc[df.index.repeat(df['repeat_cnt'])].reset_index(drop=True)
# 分组计算递减后的Date_Numerical值
df_2['Date_Numerical'] = df_2['Date_Numerical'] - 30 * df_2.groupby(level=0).cumcount()
# 删除辅助计算列
df_2 = df_2.drop('repeat_cnt', axis=1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 13:06:03